Lo mantendría abierto todo el tiempo y lo cerraría en algún método de ciclo de vida como onStop
o onDestroy
. de esa manera, puede verificar fácilmente si la base de datos ya está en uso llamando isDbLockedByCurrentThread
o isDbLockedByOtherThreads
en el SQLiteDatabase
objeto individual cada vez que lo use. esto evitará múltiples manipulaciones en la base de datos y salvará su aplicación de un posible bloqueo
por lo que en su singleton, es posible que tenga un método como este para obtener su único SQLiteOpenHelper
objeto:
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;
}
así que siempre que desee utilizar su objeto auxiliar abierto, llame a este método getter (asegúrese de que esté enhebrado)
otro método en su singleton puede ser (llamado CADA VEZ antes de intentar llamar al getter anterior):
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
}
}
es posible que también desee cerrar la base de datos en el singleton:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
Si los usuarios de su aplicación tienen la capacidad de crear muchas interacciones con la base de datos muy rápidamente, debe usar algo como lo que he demostrado anteriormente. pero si hay interacciones mínimas con la base de datos, no me preocuparía por eso, y solo crearía y cerraría la base de datos cada vez.