SQLite没有在Android应用程序中保存我的id

时间:2014-08-02 00:01:18

标签: android sqlite

这个简单的问题让我困住了好几个小时......

当我通过db.insert(TABLE_NAME,null,myValues)向我的数据库添加值时,将返回我的项目的新ID。

在这次电话会议之后,我想更新我的参赛作品。因此我打电话给db.update(TABLE_NAME, values, MY_ID_NAME + " = " + returnedId, null)。我期望得到1返回,因为一个条目受到此更新的影响。

然而,我得到0.我的id根本没有保存到数据库中。如果我尝试更复杂的查询,我总是得到我需要的每个值,但id,总是0。

我不知道如何找到我的错 - 我得到一个光标,尝试通过long id = cursor.getLong(0)获取id,它将返回0.

我的CreateStatement以:

开头
"CREATE TABLE " + TABLE_NAME + "("+ MY_ID_NAME + " LONG PRIMARY KEY, "....

另外,我需要提一下,我在内存数据库上工作以进行测试。

缺少什么?我做错了什么?

另外:我决定只在开头通过Singleton-Pattern打开数据库 - 直到现在这都不是问题

Edit2:我也忘了提到的是我目前正在使用InstrumentationTestCase-environent进行一些单元测试

2 个答案:

答案 0 :(得分:1)

我几乎肯定在创建表时必须在Android的SQLite中调用主要ID号_id,并在将表作为_ID查询时引用。

所以在这种情况下:

"CREATE TABLE " + TABLE_NAME + "(_id LONG PRIMARY KEY, "....

编辑:

试试这个:

"CREATE TABLE " + TABLE_NAME + "("+ MY_ID_NAME + " LONG PRIMARY KEY AUTOINCREMENT, "...

虽然我很好奇为什么你选择使用LONG代替INTEGER

答案 1 :(得分:1)

经过数小时的测试和调试,Zolnoor的答案几乎是正确的:

SQLite不允许LONG PRIMARY KEY语句,而SQLite-Documentation中描述的INTEGER PRIMARY KEY {:}}

  

rowid表的数据存储为B-Tree结构,包含每个表行的一个条目,使用rowid值作为键。这意味着通过rowid检索或排序记录很快。搜索具有特定rowid的记录,或者搜索指定范围内rowid的所有记录的速度大约是通过指定任何其他PRIMARY KEY或索引值进行的类似搜索的两倍。

     

如下所述,如果rowid表的主键由单个列组成,并且该列的声明类型为" INTEGER "在大写和小写的任何混合中,该列成为rowid的别名。这样的列通常被称为"整数主键"。如果声明的类型名称恰好是" INTEGER",则PRIMARY KEY列仅变为整数主键。其他整数类型的名称,如" INT"或" BIGINT"或者" SHORT INTEGER"或者" UNSIGNED INTEGER"导致主键列表现为具有整数关联和唯一索引的普通表列,而不是rowid的别名。