Lo terrei aperto per tutto il tempo e lo chiuderò con un metodo del ciclo di vita come onStopo onDestroy. in questo modo, puoi facilmente verificare se il database è già in uso chiamando isDbLockedByCurrentThreado isDbLockedByOtherThreadssul singolo SQLiteDatabaseoggetto ogni volta prima di utilizzarlo. ciò impedirà più manipolazioni al database e salverà l'applicazione da un potenziale arresto anomalo
quindi nel tuo singleton, potresti avere un metodo come questo per ottenere il tuo singolo SQLiteOpenHelperoggetto:
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;
}
quindi ogni volta che vuoi usare il tuo oggetto helper aperto, chiama questo metodo getter (assicurati che sia filettato)
un altro metodo nel tuo singleton potrebbe essere (chiamato OGNI VOLTA prima di provare a chiamare il getter sopra):
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
}
}
potresti anche voler chiudere il database nel singleton:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
se gli utenti della tua applicazione hanno la capacità di creare molte interazioni con il database molto rapidamente, dovresti usare qualcosa come ho dimostrato sopra. ma se ci sono interazioni con il database minime, non me ne preoccuperei e creo e chiudi il database ogni volta.