я бы оставил его открытым все время и закрыл бы его каким-нибудь методом жизненного цикла, таким как 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;
}
поэтому всякий раз, когда вы хотите использовать свой открытый вспомогательный объект, вызывайте этот метод getter (убедитесь, что он потоковый)
другим методом в вашем синглтоне может быть (КАЖДЫЙ РАЗ, прежде чем пытаться вызвать вызывающий метод выше):
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();
}
если пользователи вашего приложения имеют возможность очень быстро создавать множество взаимодействий с базой данных, вам следует использовать что-то, как я продемонстрировал выше. но если взаимодействие с базой данных минимально, я бы об этом не беспокоился, а просто каждый раз создавал и закрывал базу данных.