这个简单的问题让我困住了好几个小时......
当我通过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进行一些单元测试
答案 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的别名。