2009-11-24 18 views
0

我是新来的sqlite,所以请耐心等待:)我如何重新排序在sqlite的主索引与UITableView一起使用?

我有一个UITableView读取来自sqlite数据库的数据。 如果我删除一条记录,数据库中的行将被删除。问题在于其他行保留其主键,例如,我有3行,主键是1,2,4。 有没有可能将键更新为1,2,3?

非常感谢!

编辑:创建我的表:

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

如果我理解正确,您希望在删除后重新排序主键。 – 2009-11-24 17:59:43

+0

是的,你说得对。 :)你知道有这种可能吗? – user134282 2009-11-24 18:05:41

回答

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; 
+0

我已经尝试过REINDEX mytable。不幸的是,这并没有工作:( – user134282 2009-11-24 18:15:29

+0

你可以编辑你的问题,以显示你如何创建表和索引? – 2009-11-24 18:16:29

+0

谢谢,我会尝试。如何删除记录或添加一个? – user134282 2009-11-24 18:25:27