2014-02-18 30 views
0

我有一個關於在Android中的SQLite數據庫表中插入默認值的問題。我有一個DBHandler(顯然)負責創建數據庫,表和執行CRUD查詢。如何在Android SQLite中插入默認值?

但我似乎無法弄清楚,是如何在表中插入默認值。 首先,我試着用下面的方法將在我的DBHandler默認值:

// 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(); 
} 

被稱爲用這樣的方法的onCreate():

@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"); 
} 

但由於某些原因,這引起了應用程序崩潰,給我下面的logcat消息:

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) 

然後我試圖將這種「默認值」從我的UI調用addSetting方法像這樣:

db = new DBHandler(getApplicationContext()); 
db.addSetting("access_admin_fingers", "2"); 

哪些工作!但我的問題在於:爲什麼我不能在DBHandler中使用這種方法?

此外,什麼prober方式插入默認值在Android SQLite數據庫?

回答

5

您已有您的SQLiteDatabase對象onCreate()。你可以改變你的方法採取SQLiteDatabase參數:

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); 
} 

,並稱之爲:

@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"); 
} 
+1

當然!有道理,非常感謝! :) – Langkiller

1

有很多方法。你可以通過調用SQliteDatabase Object本身就像訪問DB到您的DBHelper類:

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

這裏,DB是SQliteDatabase Object

或者您可以直接在您的onCreate()方法中運行插入查詢。