मैं इसे पूरे समय खुला रखूंगा, और इसे कुछ जीवनचक्र विधि जैसे कि 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;
}
इसलिए जब भी आप अपनी ओपन हेल्पर ऑब्जेक्ट का उपयोग करना चाहते हैं, तो इस गेट्टर विधि को कॉल करें (सुनिश्चित करें कि यह थ्रेडेड है)
आपके सिंगलटन में एक और तरीका हो सकता है (ऊपर दिए गए गेट को कॉल करने का प्रयास करने से पहले हर समय कहा जाता है):
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();
}
यदि आपके एप्लिकेशन के उपयोगकर्ताओं में बहुत तेज़ी से कई डेटाबेस इंटरैक्शन बनाने की क्षमता है, तो आपको कुछ ऐसा उपयोग करना चाहिए जैसे मैंने ऊपर दिखाया है। लेकिन अगर कोई न्यूनतम डेटाबेस इंटरैक्शन है, तो मैं इसके बारे में चिंता नहीं करूंगा, और हर बार डेटाबेस बनाएं और बंद करें।