db オブジェクトの単一インスタンスを使用する databaseprovider クラスを作成しました。オブジェクトはメイン アクティビティで作成され、onDestroy メソッドで閉じられます。これは問題ないようです (ただし、シミュレートできない一部のユーザーのデバイスでは、db が既に閉じられている、または db が開いていないなどのエラーが発生します)。
コンテンツ ダウンロード用のサービスをアプリケーションに追加したいのですが、このサービスはスケジューラで実行できるため、db オブジェクトの単一インスタンスが機能しないと考えられます。サービスに別のオブジェクトを使用する必要がありますか?一貫性の問題が発生しますか? 最善の方法を教えてください。
データベースプロバイダークラスの例:
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();
}
}