将SQL行加载到索引的UITableView中

时间:2012-05-21 19:23:05

标签: iphone sqlite uitableview

我在SQLite数据库中有大约2000行。每行都有一个整数ID和一个字符串值。我想将它们填充到UITableView中,其字母索引与“联系人”应用程序一样。

在不使用CoreData的情况下实现与Contacts应用程序一样好的性能是否可行,只要我不需要重新实现CoreData为您做的所有事情(例如缓存等)?

我尝试使用每页50行的分页来实现这一点,并在tableview滚动超过25行时在另一个线程中预加载下一页。如果滚动不是很快,但是当它滚动得非常快时,它仍然会滞后。我认为填充50件临时NSArray的步骤需要很长时间。

此外,这种方法对于UITableView的索引不能很好地工作,因为加载是按顺序完成的,而索引会跳过。我想在初始化时为每个索引键加载前10行,但同样,它会很慢(填充一个包含260个项目的数组)。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

看起来同时获取几千行的性能应该不是什么大问题(你应该只能预取它们)。

我会在你的表上异步运行一个SELECT,用于你想要的任何列(比如引用的索引,也许只是要显示的字符串),然后将它们放入键入索引的NSMutableDictionary,然后重新加载表数据。 cellForRowAtIndexPath UITableViewDataSource函数将使用此字典。

如果允许用户选择行以查看详细信息,则可以在选择时对该行的其余数据运行查询。

ViewDidLoadViewWillAppear中异步执行初始提取将阻止UI在用户查看表时锁定,并且在几乎所有情况下,表实际上都应该已经可见桌子。

初始提取(在后台线程上执行,然后在主线程上重新加载表)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^()
               {
                    //perform your query here
                   dispatch_async(dispatch_get_main_queue(), ^()
                                  {
                                    [self.tableView reloadData]
                                  });
               });

答案 1 :(得分:0)

我仅以A-Z为例

在表格中取26节。

将有26个查询来获取数据 首先从A开始 第二个是从B开始 第三个是从C ......开始,然后是从Z开始 在cellForRowAtIndexPath()。

直到用户不滚动表格,它才会获取其他alpha赌注的数据。

如果每个从A到Z包含100个名称(文本)。

仍然不会花太多时间。

希望你能从这里得到想法..