当表只包含_id时,Android Sqlite INSERT错误

时间:2012-07-18 06:17:47

标签: android sqlite

我有一个只包含_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)不能为null!根据{{​​3}}中的语法,我希望能够运行SQLite代码:

INSERT INTO rule DEFAULT VALUES;  

如何使用android insert方法实现这样的效果?或者我需要添加到我的create语句中吗?

UPDATE:在表中只包含rowid的情况下,正确的语法是使用INSERT INTO _ _ DEFAULT VALUES。

android中列出的sqlite insert方法不支持DEFAULT VALUES作为选项。

SQLite language docs并且要获得对默认值的支持,需要执行以下命令:

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转换为自动递增的值来解决此问题(以及DEFAULT VALUES)。

5 个答案:

答案 0 :(得分: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);

应该给你想要的结果。

答案 1 :(得分:1)

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

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

在您的情况下,您需要手动设置每个插入行的ID。这样,当您插入空行时,它会自动递增它。

答案 2 :(得分: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)

答案 3 :(得分: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。

答案 4 :(得分:0)

插入内容只需要输入一个空值

db.insert ("people", null, c);