我有一个只包含_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)。
答案 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)
检查以下内容:
SQL不允许在不命名至少一个列名的情况下插入完全空行。如果提供的值为空,则不知道列名称,并且无法插入空行。如果未设置为null,则nullColumnHack参数提供可为空的列名称的名称,以便在值为空的情况下显式插入NULL。
答案 4 :(得分:0)
插入内容只需要输入一个空值
db.insert ("people", null, c);