Je le garderais ouvert tout le temps et le fermerais dans une méthode de cycle de vie telle que onStop
ou onDestroy
. de cette façon, vous pouvez facilement vérifier si la base de données est déjà utilisée en appelant isDbLockedByCurrentThread
ou isDbLockedByOtherThreads
sur l' SQLiteDatabase
objet unique à chaque fois avant de l'utiliser. cela empêchera de multiples manipulations de la base de données et sauvera votre application d'un crash potentiel
donc dans votre singleton, vous pourriez avoir une méthode comme celle-ci pour obtenir votre seul SQLiteOpenHelper
objet:
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;
}
donc chaque fois que vous souhaitez utiliser votre objet d'assistance ouvert, appelez cette méthode getter (assurez-vous qu'elle est filetée)
une autre méthode de votre singleton peut être (appelée CHAQUE FOIS avant d'essayer d'appeler le getter ci-dessus):
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
}
}
vous pouvez également fermer la base de données dans le singleton:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
si les utilisateurs de votre application ont la possibilité de créer très rapidement de nombreuses interactions de base de données, vous devez utiliser quelque chose comme je l'ai démontré ci-dessus. mais s'il y a des interactions minimales avec la base de données, je ne m'inquiéterais pas à ce sujet, et créer et fermer la base de données à chaque fois.