所以我想出了一些想法,我想知道它是否可以实现。
假设我有多个表(数据库模型),每个表都由某个类表示。我不会将单例模式与 open helper 一起使用,所以我创建了一些简单的类来提供数据库的单个实例。我的想法是,只要所有表都包含对 SQLiteDatabase 的引用(由 open helper 返回),它们都将使用相同的数据库实例,并且可能不需要与数据库同步工作,因为 open helper 会这样做。当最后一个表完成它的工作,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();
}
}
}