Я бы держал его открытым все время и закрывал каким-нибудь методом жизненного цикла, например onStop
или onDestroy
. Таким образом, вы можете легко проверить , если база данных уже используется по телефону isDbLockedByCurrentThread
или isDbLockedByOtherThreads
на одном SQLiteDatabase
объекте каждый раз , прежде чем использовать его. это предотвратит множественные манипуляции с базой данных и спасет ваше приложение от потенциального сбоя
поэтому в вашем синглтоне у вас может быть такой метод для получения вашего единственного SQLiteOpenHelper
объекта:
private SQLiteDatabase db;
private MyDBOpenHelper mySingletonHelperField;
public MyDBOpenHelper getDbHelper() {
db = mySingletonHelperField.getDatabase();//returns the already created database object in my MyDBOpenHelper class(which extends `SQLiteOpenHelper`)
while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads()) {
//db is locked, keep looping
}
return mySingletonHelperField;
}
поэтому всякий раз, когда вы хотите использовать свой открытый вспомогательный объект, вызывайте этот метод получения (убедитесь, что он многопоточен)
другой метод в вашем синглтоне может быть (вызывается КАЖДЫЙ РАЗ, прежде чем вы попытаетесь вызвать метод получения выше):
public void setDbHelper(MyDBOpenHelper mySingletonHelperField) {
if(null == this.mySingletonHelperField) {
this.mySingletonHelperField = mySingletonHelperField;
this.mySingletonHelperField.setDb(this.mySingletonHelperField.getWritableDatabase());//creates and sets the database object in the MyDBOpenHelper class
}
}
вы также можете закрыть базу данных в синглтоне:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
Если пользователи вашего приложения могут очень быстро создавать множество взаимодействий с базой данных, вам следует использовать что-то вроде того, что я продемонстрировал выше. но если взаимодействие с базой данных минимально, я бы не стал беспокоиться об этом и просто каждый раз создавал и закрывал базу данных.