Pozostawiłbym go otwarty przez cały czas i zamknąłbym go w jakiejś metodzie cyklu życia, takiej jak onStop
lub onDestroy
. w ten sposób możesz łatwo sprawdzić, czy baza danych jest już używana, dzwoniąc isDbLockedByCurrentThread
lub isDbLockedByOtherThreads
pojedynczoSQLiteDatabase
obiektu za każdym razem przed użyciem. zapobiegnie to wielu manipulacjom w bazie danych i uchroni aplikację przed potencjalną awarią
więc w swoim singletonie możesz mieć taką metodę, aby pobrać pojedynczy SQLiteOpenHelper
obiekt:
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;
}
więc kiedy chcesz użyć swojego otwartego obiektu pomocniczego, wywołaj tę metodę pobierającą (upewnij się, że jest podzielona na wątki)
inną metodą w twoim singletonie może być (nazywana KAŻDYM RAZEM zanim spróbujesz wywołać powyższy 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
}
}
możesz chcieć zamknąć bazę danych również w singletonie:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
jeśli użytkownicy Twojej aplikacji mają możliwość bardzo szybkiego tworzenia wielu interakcji z bazą danych, powinieneś użyć czegoś, co pokazałem powyżej. ale jeśli interakcje z bazą danych są minimalne, nie martwiłbym się tym i po prostu tworzyłem i zamykałem bazę danych za każdym razem.