将大量Sqlite行加载到UITableView中

时间:2011-12-06 12:45:32

标签: iphone objective-c ios ipad sqlite

需要在我的UITableView中加载20,000个项目,我想知道最好的方法是什么。我目前正在SQLite中使用直接查询。这会消耗太多内存并且会使应用程序运行缓慢。

2 个答案:

答案 0 :(得分:3)

有几个选项:透明地分页数据或实现类似邮件的内容,点击再加载25个。

如果您透明地分页数据

UITableView具有回调,例如行的总数和加载数据,因此它是完美的,它是虚拟的,单元格可以重复使用。

但是,你不能做一个基本的选择,你必须一次选择x - 例如,一个50页。你必须首先选择count(*)作为完整的查询,所以你知道然后计数。然后,当回叫要求行353时,你需要计算第8页(读取50页),选择那些50并返回行353的数据。当要求354时,你已经在内存中有第8页所以你返回。当您跨越页面边界时,您必须重新选择。内存减少了,因为你一次只在内存中保存一页结果。

有趣的问题是你如何以稳定的方式一次查询50个。最简单的模式是增加稳定的int ID。这取决于您的数据。例如,如果它是基于用户的谓词查询,那么如何持久保存20K以便您可以一次进行50页翻页?没有内存,您将被迫将用户谓词的结果写入sqlite中的另一个表。

如果你想进行优化,你可以按照用户滚动的方向向前读到下一页(行是否要求递增或递减?)这可能会在页面边界上暂停。

如果一次加载25个

这种模式要简单得多。在表格的页脚中,用户可以单击加载25个以上,然后更改总回调数并重新加载数据。

<强>权衡吗

嗯,无论用户滚动多远,分页都透明地具有在选择到内存中时不会有多于一个(或n)页面的好处。在另外25个模型中,随着用户越来越深入并进入数据集,它会消耗更多内存。透明分页显然要复杂得多,因此您应该考虑您想要的用户体验以及人们进入数据集的距离。

最后一点,如果你有那么多行,你需要一个按字母顺序排列的索引(或类似的概念),这样用户就可以跳过那么多数据。您还可以回到绘图板并考虑是否有其他数据或访问模式以避免视图中的20K行:)

答案 1 :(得分:1)

你真的不应该将所有项目加载到用户界面中,毕竟用户无法阅读所有项目,也无法全部显示。

我建议您以较小批量加载项目,并将它们绑定到用户滚动数据所触发的滚动事件。

例如,如果您可以显示50行数据,那么在可以查看的任何一侧加载50行数据。然后,当用户滚动数据时,您会到达一个点(比如第80行),从而加载接下来的50行并从UI中删除前50行。