我有一个只包含 _id 的 SQLite 表:
"create table rule (_id integer primary key);";
运行这组命令时:
ContentValues initialValues = new ContentValues();
mDb.insert(TABLE, null, initialValues)
我得到以下异常:
android.database.sqlite.SQLiteException: near "null": syntax error (code 1): , while compiling: INSERT INTO rule(null) VALUES (NULL)
发生初始错误是因为 ContentValues 不能为空。Android 提供了一个名为 nullColumnHack 的便利参数,它允许您传递值为 null 的单个列,以绕过此问题。
但是,这不适用于我的情况,因为行 id (_id) 不能为空!根据SQLite 语言文档中的语法,我希望能够运行 SQLite 代码:
INSERT INTO rule DEFAULT VALUES;
我怎样才能使用android插入方法来实现这样的事情?或者有什么我需要添加到我的创建语句中的吗?
更新:在表仅包含 rowid 的情况下,正确的语法是使用 INSERT INTO _ _ DEFAULT VALUES。
android 中列出的 sqlite 插入方法不支持将 DEFAULT VALUES 作为选项。
已向 google 提交了一个错误,为了获得对默认值的支持,需要执行以下命令:
mDb.execSQL("INSERT INTO rule DEFAULT VALUES;");
Cursor c = mDb.rawQuery("SELECT last_insert_rowid()",null);
c.moveToFirst();
int rowid = c.getInt(0);
如已接受的答案中所述,我们可以通过使用 nullHackColumn 并将行 id (_id) 分配给 null 并让 SQLite 从 null 转换为自动递增值来解决此问题(和默认值)。