Extend SQLiteOpenHelper as a singleton class in Android
Update: 2012-07-27
Today I wanted to keep my DatabaseHelper class unique and public in all my activities. Till now I kept creating and destroying a DatabaseHelper object for each Activity I was bringing in foreground. Thanks to Konstantinos Vaggelakos post (Database SQLiteOpenHelper singleton class for Android) I added the following code to my class and now I have a singleton class which helps me to access my database.
It is useful to keep only one reference to an open writabe SQLiteDatabase object, so I added myWritableDb as a member and the method getMyWritableDatabase() which returns the same writable database object every time.
Now we have a SQLiteDatabase object as a class member and we do not want to forget it open and leak. So we override onClose() method and close it manually.
public class DatabaseHelper extends SQLiteOpenHelper {
private final Context myContext;
private static DatabaseHelper mInstance;
private static SQLiteDatabase myWritableDb;
/**
* Constructor takes and keeps a reference of the passed context in order to
* access to the application assets and resources.
*
* @param context
* the application context
*/
private DatabaseHelper(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
}
/**
* Get default instance of the class to keep it a singleton
*
* @param context
* the application context
*/
public static DatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new DatabaseHelper(context);
}
return mInstance;
}
/**
* Returns a writable database instance in order not to open and close many
* SQLiteDatabase objects simultaneously
*
* @return a writable instance to SQLiteDatabase
*/
public SQLiteDatabase getMyWritableDatabase() {
if ((myWritableDb == null) || (!myWritableDb.isOpen())) {
myWritableDb = this.getWritableDatabase();
}
return myWritableDb;
}
@Override
public void close() {
super.close();
if (myWritableDb != null) {
myWritableDb.close();
myWritableDb = null;
}
}
Comments