Android SQLite DB When to Close
i would keep it open the whole time, and close it in some lifecycle method such as onStop
or onDestroy
. that way, you can easily check if the database is already in use by calling isDbLockedByCurrentThread
or isDbLockedByOtherThreads
on the single SQLiteDatabase
object every time before you use it. this will prevent multiple manipulations to the database and save your application from a potential crash
so in your singleton, you might have a method like this to get your single SQLiteOpenHelper
object:
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;
}
so whenever you want to use your open helper object, call this getter method(make sure it's threaded)
another method in your singleton may be(called EVERY TIME before you try to call the getter above):
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
}
}
you may want to close the database in the singleton as well:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
if the users of your application have the ability to create many database interactions very quickly, you should use something like i have demonstrated above. but if there is minimal database interactions, i wouldn't worry about it, and just create and close the database every time.
As of now there is no need to check if database locked by another thread.
While you use singleton SQLiteOpenHelper in every thread you are safe.
From isDbLockedByCurrentThread
documentation:
The name of this method comes from a time when having an active connection to the database meant that the thread was holding an actual lock on the database. Nowadays, there is no longer a true "database lock" although threads may block if they cannot acquire a database connection to perform a particular operation.
isDbLockedByOtherThreads
is deprecated since API Level 16.