saya akan tetap membukanya sepanjang waktu, dan menutupnya dalam beberapa metode siklus hidup seperti onStopatau onDestroy. dengan cara itu, Anda dapat dengan mudah memeriksa apakah database sudah digunakan dengan memanggil isDbLockedByCurrentThreadatau isDbLockedByOtherThreadspada satu SQLiteDatabaseobjek setiap kali sebelum Anda menggunakannya. ini akan mencegah beberapa manipulasi ke database dan menyimpan aplikasi Anda dari potensi crash
jadi di singleton Anda, Anda mungkin memiliki metode seperti ini untuk mendapatkan SQLiteOpenHelperobjek tunggal Anda :
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;
}
jadi setiap kali Anda ingin menggunakan objek pembantu terbuka, panggil metode pengambil ini (pastikan itu berulir)
Metode lain di tunggal Anda mungkin (dipanggil SETIAP KALI sebelum Anda mencoba memanggil pengambil di atas):
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
}
}
Anda mungkin ingin menutup database di singleton juga:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
jika pengguna aplikasi Anda memiliki kemampuan untuk membuat banyak interaksi database dengan sangat cepat, Anda harus menggunakan sesuatu seperti yang telah saya tunjukkan di atas. tetapi jika ada interaksi database minimal, saya tidak akan mengkhawatirkannya, dan cukup buat dan tutup database setiap saat.