当表仅包含_id时,出现Android Sqlite INSERT错误



我有一个SQLite表,它只包含_id:

"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!根据SQLite语言文档中的语法,我希望能够运行SQLite代码:

INSERT INTO rule DEFAULT VALUES;  

如何使用android insert方法实现这样的功能?或者我需要在create语句中添加一些内容吗?

UPDATE:在表只包含行ID的情况下,正确的语法是使用INSERT INTO__DEFAULT VALUES。

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

谷歌已经提交了一个错误,为了获得对默认值的支持,需要执行以下命令:

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)。

正如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);

应该会给你想要的结果。

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

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

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

试试这个方法:

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

检查以下内容:

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

SQL不允许在不命名至少一个列名的情况下插入完全空的行。如果提供的值为空,则没有已知的列名,并且不能插入空行。如果未设置为null,nullColumnHack参数将提供可为null的列名的名称,以便在值为空的情况下显式插入null。

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

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

最新更新