我使用此方法删除sqlite db中的行:
db.execSQL("delete from "+TABLE_NUMS+" where _ID = '" + this.rowID + "'");
然后我更新其余的ID以使我的条目连续:
db.execSQL("UPDATE "+TABLE_NUMS+" set _ID = (_ID - 1) WHERE _ID > "+this.rowID);
它工作正常,但是当我向我的数据库中添加新条目时,新条目的ID仍然会添加,就好像已删除的条目一样,比如我有10行,ID从1到10开始,然后我删除数字5和6,行变为1到8,但新条目的ID将是11.所以我的ID序列将是1到8和11.我该如何解决这个问题?
答案 0 :(得分:2)
将生成上述正常的ROWID选择算法 只要你从不使用,就单调增加独特的ROWID 最大ROWID值,您永远不会删除表中的条目 最大的ROWID。如果您删除了行或者您曾创建过行 使用最大可能的ROWID,然后从之前删除的ROWID 创建新行和新创建的ROWID时可能会重用行 可能不是严格按升序排列。 http://www.sqlite.org/autoinc.html
这就是SQLite的工作方式。
如果你真的需要连续使用Ids,请不要使用自动增量。 自己插入ID。 您可以先选择MAX(_ID)以获取最后一个ID(最大值)。
答案 1 :(得分:1)
这是因为您在创建表时在_ID上设置了自动增量。因此,除非您明确设置,否则您添加的每一行都将自动给出一个数字。如果绝对需要连续订购_ID,我建议您自己设置,而不是使用自动增量。
以下是重置方法:
delete from your_table;
delete from sqlite_sequence where name='your_table';
这将删除所有数据并重置序列。
答案 2 :(得分:1)
SQLite使用特殊的SQLITE_SEQUENCE表跟踪表所拥有的最大ROWID。您可以将该序列修改为:
UPDATE SQLITE_SEQUENCE SET seq = this.ID -1 WHERE name = TABLE_NUMS
在this question中询问相同的功能。
答案 3 :(得分:0)
SQLite在特殊的SQLITE_SEQUENCE表中保留最大的ROWID。您可以将该表更新为:
db.execSQL("UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE NAME = '"+TABLE_NAME+"'");
OR
将该表删除为:
db.delete("SQLITE_SEQUENCE","NAME = ?",new String[]{TABLE_NAME});