0

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?

2 Answers 2

7

You already have your SQLiteDatabase object in onCreate(). You can change your method to take a SQLiteDatabase parameter:

public void addSetting(SQLiteDatabase db, String key, String value) {
    ContentValues values = new ContentValues();
    values.put(SETTING_KEY, key);
    values.put(SETTING_VALUE, value);
    db.insert(TABLE_APP_SETTINGS, null, values);
}

and call it:

@Override
public void onCreate(SQLiteDatabase db) {
    // creating tables
    db.execSQL(DATABASE_CREATE);
    db.execSQL(CREATE_TABLE_SETTINGS);

    // insert default values
    this.addSetting(db, "access_admin_fingers", "2");
}
Sign up to request clarification or add additional context in comments.

Comments

1

There are many ways. You can access your DB into your DBHelper class by calling SQliteDatabase Object itself like:

// insert default values
db.addSetting("access_admin_fingers", "2"); 

Here, DB is SQliteDatabase Object.

Or you can directly run insert query into your onCreate() method.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.