I have a question about inserting default values in a SQLite db table in android. I have a DBHandler (obviously) which takes care of creating the db, the tables and executing CRUD queries.
But what I can't seem to figure out, is how to insert default values in a table. First I tried inserting the default values in my DBHandler with the following method:
// Write settings to db
public void addSetting(String key, String value) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(SETTING_KEY, key);
values.put(SETTING_VALUE, value);
db.insert(TABLE_APP_SETTINGS, null, values);
db.close();
}
Which is called with the method onCreate() like this:
@Override
public void onCreate(SQLiteDatabase db) {
// creating tables
db.execSQL(DATABASE_CREATE);
db.execSQL(CREATE_TABLE_SETTINGS);
// insert default values
this.addSetting("access_admin_fingers", "2");
}
But for some reason, this caused the app to crash, giving me the following LogCat messages:
02-18 09:43:52.050: W/dalvikvm(14297): threadid=1: thread exiting with uncaught exception (group=0x41f3d930)
02-18 09:43:52.060: E/AndroidRuntime(14297): FATAL EXCEPTION: main
02-18 09:43:52.060: E/AndroidRuntime(14297): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.customerratingsystem/com.customerratingsystem.AdminActivity}: java.lang.IllegalStateException: getDatabase called recursively
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.app.ActivityThread.access$600(ActivityThread.java:141)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.os.Handler.dispatchMessage(Handler.java:99)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.os.Looper.loop(Looper.java:137)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.app.ActivityThread.main(ActivityThread.java:5041)
02-18 09:43:52.060: E/AndroidRuntime(14297): at java.lang.reflect.Method.invokeNative(Native Method)
02-18 09:43:52.060: E/AndroidRuntime(14297): at java.lang.reflect.Method.invoke(Method.java:511)
02-18 09:43:52.060: E/AndroidRuntime(14297): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
02-18 09:43:52.060: E/AndroidRuntime(14297): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
02-18 09:43:52.060: E/AndroidRuntime(14297): at dalvik.system.NativeStart.main(Native Method)
02-18 09:43:52.060: E/AndroidRuntime(14297): Caused by: java.lang.IllegalStateException: getDatabase called recursively
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
02-18 09:43:52.060: E/AndroidRuntime(14297): at com.db.DBHandler.addSetting(DBHandler.java:69)
02-18 09:43:52.060: E/AndroidRuntime(14297): at com.db.DBHandler.onCreate(DBHandler.java:51)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
02-18 09:43:52.060: E/AndroidRuntime(14297): at com.db.DBHandler.getSetting(DBHandler.java:83)
02-18 09:43:52.060: E/AndroidRuntime(14297): at com.customerratingsystem.AdminActivity.onCreate(AdminActivity.java:28)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.app.Activity.performCreate(Activity.java:5104)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
02-18 09:43:52.060: E/AndroidRuntime(14297): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
Then I tried inserting this "default value" by calling the addSetting method from my UI like this:
db = new DBHandler(getApplicationContext());
db.addSetting("access_admin_fingers", "2");
Which works! But my question here is: why was I not able to use this method from within the DBHandler?
Also, what is the prober way to insert default values in an android SQLite db?