我是 sqlite 新手,所以请耐心等待 :)
我有一个 UITableView 从 sqlite db 读取数据。如果我删除一条记录,则数据库中的行将被删除。问题是其他行保留了它们的主键,例如,我有 3 行,主键是 1、2、4。是否有可能将密钥更新为 1、2、3?
非常感谢!
编辑:我创建我的表:
CREATE TABLE mytable (ID INTEGER PRIMARY KEY AUTOINCREMENT, value1 TEXT);
使用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;