Java 如何在Android SQLite中插入默认值?

Java 如何在Android SQLite中插入默认值?,java,android,android-sqlite,Java,Android,Android Sqlite,我有一个关于在android中的SQLite db表中插入默认值的问题。我有一个DBHandler(显然)负责创建数据库、表和执行CRUD查询 但我似乎不明白的是,如何在表中插入默认值。 首先,我尝试使用以下方法在我的DBHandler中插入默认值: // Write settings to db public void addSetting(String key, String value) { SQLiteDatabase db = this.getWritableDatabase(

我有一个关于在android中的SQLite db表中插入默认值的问题。我有一个DBHandler(显然)负责创建数据库、表和执行CRUD查询

但我似乎不明白的是,如何在表中插入默认值。 首先,我尝试使用以下方法在我的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");
}
db = new DBHandler(getApplicationContext());
db.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方法插入此“默认值”,如下所示:

@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");
}
db = new DBHandler(getApplicationContext());
db.addSetting("access_admin_fingers", "2");
真管用!但我的问题是:为什么我不能在DBHandler中使用这个方法


另外,在android SQLite数据库中插入默认值的方法是什么?

有很多种方法。通过调用
SQliteDatabase对象
本身,可以将
DB
访问到
DBHelper
类中,如下所示:

// insert default values
db.addSetting("access_admin_fingers", "2"); 
这里,DB是
SQliteDatabase对象


或者您可以直接在
onCreate()
方法中运行insert查询。

您在
onCreate()中已经有了
SQLiteDatabase
对象。您可以更改方法以获取
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");
}