আমি এটা পুরো সময় খুলতে রাখা, এবং যেমন কিছু জীবনচক্র পদ্ধতিতে এটি বন্ধ হবে 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();
}
যদি আপনার অ্যাপ্লিকেশনটির ব্যবহারকারীরা খুব দ্রুত অনেকগুলি ডাটাবেস ইন্টারঅ্যাকশন তৈরি করার ক্ষমতা রাখেন তবে আপনার উপরে যেমন আমি প্রদর্শন করেছি তেমন কিছু ব্যবহার করা উচিত। তবে যদি সেখানে ন্যূনতম ডাটাবেস ইন্টারঅ্যাকশন হয় তবে আমি এটি নিয়ে চিন্তা করব না এবং প্রতিবারই ডেটাবেস তৈরি এবং বন্ধ করব।