Ich würde es die ganze Zeit offen halten und es in einer Lebenszyklusmethode wie onStop
oder schließen onDestroy
. Auf diese Weise können Sie leicht überprüfen , ob die Datenbank durch den Aufruf bereits verwendet wird isDbLockedByCurrentThread
oder isDbLockedByOtherThreads
auf dem einzelnen SQLiteDatabase
Objekt jedes Mal , bevor Sie es benutzen. Dies verhindert mehrfache Manipulationen an der Datenbank und schützt Ihre Anwendung vor einem möglichen Absturz
In Ihrem Singleton haben Sie möglicherweise eine Methode wie diese, um Ihr einzelnes SQLiteOpenHelper
Objekt zu erhalten:
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;
}
Wenn Sie also Ihr offenes Hilfsobjekt verwenden möchten, rufen Sie diese Getter-Methode auf (stellen Sie sicher, dass es einen Thread hat).
Eine andere Methode in Ihrem Singleton ist möglicherweise (JEDES MAL aufgerufen, bevor Sie versuchen, den obigen Getter aufzurufen):
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
}
}
Möglicherweise möchten Sie die Datenbank auch im Singleton schließen:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
Wenn die Benutzer Ihrer Anwendung in der Lage sind, sehr schnell viele Datenbankinteraktionen zu erstellen, sollten Sie etwas verwenden, wie ich oben gezeigt habe. Aber wenn es nur minimale Datenbankinteraktionen gibt, würde ich mir darüber keine Sorgen machen und die Datenbank jedes Mal erstellen und schließen.