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