如何重新排序sqlite中的主索引以与UITableView一起使用?

时间:2009-11-24 17:55:33

标签: iphone sqlite tableview

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

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

非常感谢!

编辑:我用:

创建我的表
CREATE TABLE mytable (ID INTEGER PRIMARY KEY  AUTOINCREMENT, value1 TEXT);

1 个答案:

答案 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;