0

我是 sqlite 新手,所以请耐心等待 :)

我有一个 UITableView 从 sqlite db 读取数据。如果我删除一条记录,则数据库中的行将被删除。问题是其他行保留了它们的主键,例如,我有 3 行,主键是 1、2、4。是否有可能将密钥更新为 1、2、3?

非常感谢!

编辑:我创建我的表:

CREATE TABLE mytable (ID INTEGER PRIMARY KEY  AUTOINCREMENT, value1 TEXT);
4

1 回答 1

1

使用REINDEX (REINDEX 只重建索引结构,它实际上并没有改变任何索引的值。)

使用行的顺序作为隐式索引

与其尝试更改一大堆行的索引值,不如执行排序顺序的映射?

使用 SELECT 语句,如:

NSString* query = @"SELECT * FROM myTable ORDER BY id LIMIT 1 OFFSET %d";
query = [NSString stringWithFormat:query, indexPath.row + 1];

要删除一行,请执行以下操作:

NSString* query = @"DELETE FROM myTable WHERE ID = (SELECT ID FROM myTable ORDER BY ID LIMIT 1 OFFSET %d)";
query = [NSString stringWithFormat:query, indexPath.row + 1];

要插入,请像往常一样执行常规插入。

这样,当您删除一行时,您最终不需要编辑 ID 大于您要删除的行的每一行。这会快得多。

确保在数据库发生更改时更新表视图,以保持表视图与数据库一致。

这也有一个很好的副作用是保持你的表格视图排序。

定义触发器以更改受影响的索引

如果您真的想保留索引以使它们成为完美的系列(即:1,2,3,4,...)

您可以像这样定义删除触发器:

CREATE TRIGGER reindex AFTER DELETE ON myTable FOR EACH ROW
BEGIN
    UPDATE myTable SET ID = old.ID - 1 WHERE ID > old.ID;
END;
于 2009-11-24T18:12:54.633 回答