我创建了一个使用 db 对象的单个实例的 databaseprovider 类。对象在主 Activity 中创建并关闭 onDestroy 方法。这似乎没问题(但会出现一些错误,例如:数据库已关闭或数据库未在我无法模拟的某些用户设备上打开)。
我想向应用程序添加一项用于内容下载的服务,该服务可以使用调度程序运行,这让我想到 db 对象的单个实例将无法工作。我应该为服务使用另一个对象,它会导致一致性问题吗?您能否建议最好的方法是什么?
数据库提供者类 exm:
public class DatabaseProvider {
private static DatabaseHelper helperWriter;
public static SQLiteDatabase db_global;
public DatabaseProvider(Context c) {
helperWriter = DatabaseHelper.getHelper(c, true);
}
private static SQLiteDatabase getDB() {
if(db_global == null)
db_global = helperWriter.getWritableDatabase();
else if(!db_global.isOpen()) {
try {
db_global.close();
}
catch(Exception ex) {
ex.printStackTrace();
}
db_global = helperWriter.getWritableDatabase();
}
return db_global;
}
public String GetVersion() {
SQLiteDatabase db = getDB();
Cursor c = db.query(DatabaseHelper.PARAMETER_TABLE_NAME, new String[] {"VALUE"}, "KEY='Version'", null, null,null,null);
String version = "";
if(c.moveToNext())
{
version = c.getString(0);
}
else
version = "0";
c.close();
return version;
}
public long UpdateVersion(String value) {
ContentValues initialValues = new ContentValues();
initialValues.put(DatabaseHelper.PARAMETER_COLUMN_VALUE, value);
SQLiteDatabase db = getDB();
long r = db.update(DatabaseHelper.PARAMETER_TABLE_NAME, initialValues, "KEY='Version'", null);
if(r <= 0)
r = helperWriter.AddParameter(db, "Version", value);
//db.close();
return r;
}
public void CloseDB() {
if (db_global != null)
db_global.close();
db_global = null;
helperWriter.close();
}
}
最佳答案
不确定这是否有帮助,但是...
您不能依赖 onDestroy() 以防应用程序崩溃。 Android 也可能将您的应用保留在 RAM 中,即使您退出它也是如此。此外,如果您正在进行子 Activity ,则在使用应用程序时您的主要 Activity 可能会被破坏。它也可以重新创建。
有时最好调用打开数据库,对它做一些事情,然后在同一个函数中关闭它。如果您正在使用一项服务,它实际上可能会有所帮助。我也不确定您是否应该遇到这样一种情况,即无需一些管理代码就可以同时从多个不同的地方打开和/或访问数据库
关于android - 来自 Activity 和服务的 SQLite 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12511612/