4

我使用此方法删除我的 sqlite 数据库中的一行:

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。我该如何解决这个问题?

4

4 回答 4

3

只要您从不使用最大 ROWID 值并且从不删除表中具有最大 ROWID 的条目,上述正常的 ROWID 选择算法将生成单调递增的唯一 ROWID。如果您曾经删除行或曾经创建具有最大可能 ROWID 的行,则在创建新行时可能会重用先前删除的行中的 ROWID,并且新创建的 ROWID 可能不会严格按升序排列。 http://www.sqlite.org/autoinc.html

这就是 SQLite 的工作原理。

如果您确实需要连续使用 ID,请不要使用自动增量。自己插入ID。您可以先选择 MAX(_ID) 以获取最后一个 id(最大值)。

于 2012-07-05T14:49:20.363 回答
3

SQLite 使用特殊的 SQLITE_SEQUENCE 表来跟踪表曾经拥有的最大 ROWID。您可以将该序列修改为:

UPDATE SQLITE_SEQUENCE SET seq = this.ID -1 WHERE name = TABLE_NUMS 

在这个问题中提出了相同的功能。

于 2012-07-05T14:49:41.757 回答
1

这是因为您在创建表时在 _ID 上设置了自动增量。因此,除非您明确设置,否则您添加的每一行都会自动获得一个数字。如果您绝对需要连续顺序的 _ID,我建议您自己设置它而不是使用自动增量。

以下是如何重置它:

delete from your_table;    
delete from sqlite_sequence where name='your_table';

这将删除您的所有数据并重置序列。

于 2012-07-05T14:47:50.507 回答
0

SQLite 在特殊的 SQLITE_SEQUENCE 表中保留最大的 ROWID。您可以将该表更新为:

db.execSQL("UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE NAME = '"+TABLE_NAME+"'"); 

或者

将该表删除为:

db.delete("SQLITE_SEQUENCE","NAME = ?",new String[]{TABLE_NAME});
于 2014-07-08T06:54:52.363 回答