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 esta forma, puede verificar fácilmente si la base de datos ya está en uso llamando al isDbLockedByCurrentThread
o isDbLockedByOtherThreads
en el único objeto SQLiteDatabase
cada vez que lo use. esto evitará múltiples manipulaciones a la base de datos y guardar su solicitud de un fallo potencial
por lo que en su único, que podría tener un método como este para obtener su única 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;
}
manera siempre que lo desee utilizar su objeto ayudante abierta, llamar a este método getter (asegúrese de que está enroscado)
otro método en su Singleton se puede (llamado cada vez que antes de intentar llamar al captador de arriba):
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 desee cerrar la base de datos en el singleton así:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
si los usuarios de la aplicación tienen la capacidad de crear muchas interacciones de bases de datos muy rápidamente, usted debe usar algo como lo he demostrado anteriormente. pero si hay interacciones mínimas en la base de datos, no me preocuparía, y solo crearía y cerraría la base de datos todo el tiempo.
+1 yodo como si fuera –
Podría acelerar el acceso a la base de datos por un factor de 2 con este enfoque (mantener la base de datos abierta), gracias –
Spinning es una técnica muy mala. Ver mi respuesta a continuación. – mixel