【发布时间】:2012-07-18 06:17:47
【问题描述】:
我有一个只包含 _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 language docs 中的语法,我希望能够运行 SQLite 代码:
INSERT INTO rule DEFAULT VALUES;
如何使用 android insert 方法实现这样的效果?或者我需要在我的 create 语句中添加什么内容?
更新:在表仅包含 rowid 的情况下,正确的语法是使用 INSERT INTO __DEFAULT VALUES。
android 中列出的 sqlite 插入方法不支持将 DEFAULT VALUES 作为选项。
A bug has been filed with 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 转换为自动递增值来解决此问题(和默认值)。
【问题讨论】: