Eu iria mantê-lo aberto o tempo todo e fechá-lo em algum método de ciclo de vida, como onStop
ou onDestroy
. dessa forma, você pode verificar facilmente se o banco de dados já está em uso chamando isDbLockedByCurrentThread
ou isDbLockedByOtherThreads
no único SQLiteDatabase
objeto todas as vezes antes de usá-lo. isso evitará múltiplas manipulações no banco de dados e salvará seu aplicativo de um possível travamento
então, em seu singleton, você pode ter um método como este para obter seu ú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;
}
então, sempre que você quiser usar seu objeto auxiliar aberto, chame este método getter (certifique-se de que seja encadeado)
outro método em seu singleton pode ser (denominado CADA VEZ antes de tentar chamar o getter acima):
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
}
}
você pode querer fechar o banco de dados no singleton também:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
se os usuários de seu aplicativo têm a capacidade de criar muitas interações de banco de dados muito rapidamente, você deve usar algo como demonstrei acima. mas se houver interações mínimas com o banco de dados, eu não me preocuparia com isso, apenas criar e fechar o banco de dados todas as vezes.