设计iPhone应用程序中的大量数据

时间:2009-01-28 22:10:49

标签: iphone object model

我有一个I手机应用程序,在打开时需要显示包含大约25000条记录的数据表。每条记录包含两个字段:TITLE和DESCRIPTION。两个字段在每个表格单元格中都可见。 tableview还可以使用UISearchBar进行完全搜索。

当应用程序启动并加载此视图时,“集合对象”会从表中获取所有数据并将其加载到“项目对象”中。因为我需要两个领域进行搜索,所以我真的没有任何水合/脱水的东西;因此,完整的表在内存中。必须有更好的方法提供完整的搜索功能,但一次大大减少内存中的对象数量。

有什么想法吗?

修改

我想我应该进一步解释。

我已经在使用SQLite数据库了。我的问题是,将20,000条记录加载到内存中需要很长时间,应用程序看起来很慢。

此外,如果我在当前选择的任一侧只有100条记录,我如何搜索所有记录(包括不在内存中的记录)?

我会查看表格委托建议。

5 个答案:

答案 0 :(得分:3)

您应该使用SQL来搜索而不是将所有内容加载到内存中并从那里进行搜索。如果你像平面文件一样使用它,那么数据库是什么意思?

此外,很多应用程序都有一个“加载更多”条目作为其表视图中的最后一个,这会为视图添加更多项目。

答案 1 :(得分:2)

我会重新思考你应用的架构。

你必须记住,iPhone与桌面应用程序不同,人们不像普通电脑一样使用手机。 iPhone一次只能使用几分钟,而不是几小时。没有人会想要滚动超过20,000个条目。说实话,我不确定是否有人想在桌面应用程序中这样做。

相反,加载有限数量的条目,可能是100或200个顶部。然后让用户加载更多(或搜索他们需要的东西)。

答案 2 :(得分:2)

也许我可以澄清小组的其他成员在说什么。

您肯定知道表视图必须有一个数据源,该数据源至少在<UITableViewDatasource>协议中实现了两个必需的方法:

– tableView:cellForRowAtIndexPath:  
– tableView:numberOfRowsInSection:

我怀疑你当前的– tableView:cellForRowAtIndexPath:实现只是从你的全局集合对象中抓取两个字符串,将它们弹出到一个单元格中(希望正在被重用的单元格!)并将其返回。

它可能应该做的是根据需要从数据库中检索这些数据。我将实现一个或多个类来在应用程序和数据库之间进行调解,并返回例如每次100行作为数据源(SQLite支持LIMIT和OFFSET关键字),这将保留在有限的集合中。

当tableView调用– tableView:cellForRowAtIndexPath:时,您可以检查数据是否在本地存储的块中(我创建了一个属性来存储当前记录的偏移量),如果没有,则用一个更新本地块向DB请求下一个(或以前的,视情况而定)100个记录。

的Presto。在任何给定时间,固定数量(100)的记录都在内存中,数据源根据需要向表视图提供数据。你可能会变得更加漂亮,但这是一般的想法。

至于搜索,假设您正在对标题进行自由文本搜索,只需让数据库调解器发出类似

的问题
 'select id, title, description from yourTable where title like ?'

并绑定?无论用户输入什么,在适当的地方使用通配符(不要忘记清理你的输入......不是说任何人都非常可能在你的iPhone应用程序上执行SQL注入,但是,习惯和所有......:)

显然,如果你只是搜索而不是过滤结果,你将不得不稍微调整一下,但希望这是一个开始。

祝你好运!

答案 3 :(得分:1)

您应该尝试为表使用委托,并且只根据需要将项目加载到内存中。如果仅显示前十个项目,操作系统将仅询问您这些项目。

您还应该考虑将记录存储在SQLite数据库中。当搜索处于活动状态时,委托将对使用当前搜索词构建的SQL查询进行操作。

答案 4 :(得分:0)

在当前屏幕之前/之后搜索并保留在内存中50-200左右可能是一个好主意,这样您可以滚动项目,因为它会从数据库加载更多内容。

编辑; 如上所述,SQL lite也是一个好主意。