3

我有一个只包含 _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 转换为自动递增值来解决此问题(和默认值)。

4

5 回答 5

3

正如 jeet 提到的,您可以提供nullColumnHack第二个参数。正如您自己提到autoincrement的,没有必要增加主键的值。所以语法:

insert into rule (_id) values(null)

其中 _id 是主键,自动增量值对于 sql 是正确的。我认为大多数 SQL 数据库都会替换null为新的增量值,至少 MySQL、SQLite 和 Oracle 可以做到这一点

因此:

ContentValues cv = new ContentValues();
db.insert("rule", "_id", cv);

应该给你想要的结果。

于 2012-07-18T07:23:47.430 回答
1

您需要添加autoincrement到您的创建表查询,如:

"create table rule (_id integer primary key autoincrement);";

在您的情况下,您需要在每次插入时手动设置行的 ID。这样,当您插入一个空行时,它会自动增加它,就像您在案例中所做的那样。

于 2012-07-18T06:19:55.663 回答
0

试试这种方式:

ContentValues initialValues= new ContentValues();
if(check here --id is null----)
{
  initialValues.put("_id", "0");  
}
else
{
  initialValues.put("_id", id);  
}

mDb.insert(TABLE, null, initialValues)
于 2012-07-18T06:25:33.160 回答
0

检查以下内容:

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insert(java.lang.String, java.lang.String, android.content.ContentValues)

SQL 不允许插入一个完全空的行而不命名至少一个列名。如果您提供的值为空,则表示不知道列名并且无法插入空行。如果未设置为 null,则 nullColumnHack 参数提供可空列名称的名称,以便在您的值为空的情况下显式插入 NULL。

于 2012-07-18T07:06:37.097 回答
0

插入需要一个空值,您只需输入

db.insert ("people", null, c);
于 2019-05-27T04:43:02.260 回答