一个简单的问题让我陷入了数小时的困境...
当我通过db.insert(TABLE_NAME,null,myValues)向数据库中添加一个值时,将返回该项目的新ID。
恰好在此通话之后,我想更新我的条目。因此我打电话给db.update(TABLE_NAME, values, MY_ID_NAME + " = " + returnedId, null)
。我希望得到1个返回值,因为一个条目受此更新影响。
但是,我得到0。我的ID根本没有保存到数据库中。如果我尝试更复杂的查询,我总是会得到我需要的每个值,但id始终为0。
我不知道如何找到我的错误-我得到一个游标,尝试获取ID,long id = cursor.getLong(0)
它将返回0。
我的CreateStatement以以下内容开头:
"CREATE TABLE " + TABLE_NAME + "("+ MY_ID_NAME + " LONG PRIMARY KEY, "....
我还需要提到我出于测试目的而在内存数据库中工作。
什么不见了?我究竟做错了什么?
另外:我决定只从一开始就通过Singleton-Pattern打开数据库-到目前为止,这不是问题
Edit2:我也忘记提及的是,我目前正在InstrumentationTestCase环境中进行某些单元测试。
经过数小时的测试和调试,Zolnoor的答案几乎是正确的:
SQLite不允许使用LONG PRIMARY KEY
语句,但允许使用SQLite-Documentation中INTEGER PRIMARY KEY
所述的语句:
使用rowid值作为键,rowid表的数据存储为B树结构,其中每个表行包含一个条目。这意味着按rowid检索或排序记录很快。搜索具有特定rowid的记录,或搜索具有指定范围内的rowid的所有记录的速度大约是通过指定任何其他PRIMARY KEY或索引值进行的类似搜索的两倍。
除了下面提到的一个例外,如果rowid表的主键由单个列组成,并且该列的声明类型为大写和小写形式的“ INTEGER ”,则该列将成为rowid的别名。这样的列通常称为“整数主键”。仅当声明的类型名称恰好是“ INTEGER”时,PRIMARY KEY列才成为整数主键。其他整数类型名称(例如“ INT”或“ BIGINT”或“ SHORT INTEGER”或“ UNSIGNED INTEGER”)会导致主键列的行为与具有整数相似性和唯一索引的普通表列相同,而不是作为rowid的别名。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句