ฉันจะให้มันเปิดตลอดเวลาและปิดในวิธีวงจรบางอย่างเช่นหรือonStop
onDestroy
ด้วยวิธีนี้คุณสามารถตรวจสอบได้อย่างง่ายดายว่ามีการใช้งานฐานข้อมูลอยู่แล้วisDbLockedByCurrentThread
หรือไม่โดยการโทรหรือisDbLockedByOtherThreads
บนSQLiteDatabase
วัตถุชิ้นเดียวทุกครั้งก่อนที่คุณจะใช้งาน วิธีนี้จะป้องกันการปรับแต่งหลายอย่างในฐานข้อมูลและบันทึกแอปพลิเคชันของคุณจากเหตุขัดข้องที่อาจเกิดขึ้น
ดังนั้นในซิงเกิลตันของคุณคุณอาจมีวิธีการเช่นนี้เพื่อรับSQLiteOpenHelper
วัตถุชิ้นเดียวของคุณ:
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;
}
ดังนั้นเมื่อใดก็ตามที่คุณต้องการใช้ออบเจ็กต์ตัวช่วยเปิดของคุณให้เรียกใช้เมธอด getter (ตรวจสอบให้แน่ใจว่าเป็นเธรด)
วิธีอื่นในซิงเกิลตันของคุณอาจเป็น (เรียกทุกครั้งก่อนที่คุณจะพยายามโทรหา getter ด้านบน):
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
}
}
คุณอาจต้องการปิดฐานข้อมูลในซิงเกิลตันด้วย:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
หากผู้ใช้แอปพลิเคชันของคุณมีความสามารถในการสร้างการโต้ตอบกับฐานข้อมูลจำนวนมากได้อย่างรวดเร็วคุณควรใช้สิ่งที่ฉันได้แสดงไว้ข้างต้น แต่ถ้ามีการโต้ตอบกับฐานข้อมูลเพียงเล็กน้อยฉันก็ไม่ต้องกังวลเรื่องนี้และเพียงแค่สร้างและปิดฐานข้อมูลทุกครั้ง