微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个仅包含_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!基于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转换为自动递增的值来解决此问题(和DEFAULT VALUES).

解决方法:

正如前面提到的,您可以提供nullColumnHack作为第二个参数.正如您自己所提到的,自动增量对于增加主键的值不是必需的.
所以语法:

insert into rule (_id) values(null)

其中_id是主键,自动递增的值对于sql是正确的.我认为大多数sql数据库将用新的递增值替换null,至少MysqL,sqlite和Oracle可以做到这一点

从而:

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

应该给您想要的结果.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐