Итак, я придумал какую-то идею, и мне интересно, реализуема ли она.
Допустим, у меня есть несколько таблиц (моделей базы данных), каждая из которых представлена некоторым классом. Я не буду использовать шаблон singleton с открытым помощником, поэтому я создал простой класс для предоставления одного экземпляра базы данных. Мой Идея заключается в том, что пока все таблицы содержат ссылку на SQLiteDatabase (возвращенную открытым помощником), все они будут работать с одним и тем же экземпляром БД и, вероятно, не понадобятся для синхронизации работы с базой данных, поскольку это делает открытый помощник. Когда последняя таблица завершает свою работу, GC собирает открытый помощник (поскольку последняя ссылка будет слабой ссылкой) -> вызывается finalize(), и я закрываю базу данных во время этого метода, чтобы предотвратить любое предупреждение от ОС. Мой вопрос: может ли это работать? Будет ли он автоматически закрывать БД и будет ли он протекать или выдавать какое-то исключение?
Вот мой класс:
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();
}
}
}