我有一个仅包含_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);
应该给您想要的结果.
总结以上是内存溢出为你收集整理的当表仅包含_id时,Android Sqlite INSERT错误全部内容,希望文章能够帮你解决当表仅包含_id时,Android Sqlite INSERT错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)