それで、私はいくつかのアイデアを思いついたので、それが実現可能かどうか疑問に思っています。
複数のテーブル (データベース モデル) があり、それぞれが何らかのクラスで表されているとしましょう。オープン ヘルパーでシングルトン パターンを使用しないので、データベースの単一インスタンスを提供する単純なクラスをいくつか作成しました。アイデアは、すべてのテーブルが SQLiteDatabase (open ヘルパーによって返される) への参照を保持している限り、それらはすべて同じ DB インスタンスで動作し、おそらく open ヘルパーがこれを行うため、作業をデータベースと同期する必要はないということです。最後のテーブルが終了すると、GC がオープン ヘルパーを収集します (最後の参照は弱い参照になるため) -> finalize() が呼び出され、このメソッド中にデータベースを閉じて、OS からの警告を防ぎます。私の質問は次のとおりです:これは機能しますか?DB を自動的に閉じて、リークまたは例外をスローしますか?
これが私のクラスです:
public class DatabaseHelper {
private static WeakReference<SomeCustomOpenHelper> sDBOpenHelper;
private void notifyDBCreate(SQLiteDatabase db) {
for (DBTable table : mTables) {
table.onDBCreate(db);
}
}
private void notifyDBUpgrade(SQLiteDatabase db) {
for (DBTable table : mTables) {
table.onDBUpgrade(db);
}
}
public SQLiteDatabase getDatabase(boolean readOnly) {
SomeCustomOpenHelper dbHelper = sDBOpenHelper.get();
if (dbHelper == null) {
dbHelper = new SomeCustomOpenHelper(context, name, factory, version, new DatabaseEventsCallback());
sDBOpenHelper = new WeakReference<SomeCustomOpenHelper>(dbHelper);
}
if (readOnly) {
return dbHelper.getReadableDatabase();
} else {
return dbHelper.getWritableDatabase();
}
}
private class DatabaseEventsCallback implements IDatabaseEventsCallback {
@Override
public void onCreate(SQLiteDatabase db) {
notifyDBCreate(db);
}
@Override
public void onUpgrade(SQLiteDatabase db) {
notifyDBUpgrade(db);
}
}
interface IDatabaseEventsCallback {
void onCreate(SQLiteDatabase db);
void onUpgrade(SQLiteDatabase db);
}
private static class SomeCustomOpenHelper extends SQLiteOpenHelper {
private IDatabaseEventsCallback mCB;
public SomeCustomOpenHelper(Context context, String name, CursorFactory factory, int version, IDatabaseEventsCallback cb) {
super(context, name, factory, version);
mCB = cb;
}
@Override
public void onCreate(SQLiteDatabase db) {
mCB.onCreate(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
mCB.onUpgrade(db);
}
@Override
protected void finalize() throws Throwable {
this.close();
super.finalize();
}
}
}