我有一个I手机应用程序,在打开时需要显示包含大约25000条记录的数据表。每条记录包含两个字段:TITLE和DESCRIPTION。两个字段在每个表格单元格中都可见。 tableview还可以使用UISearchBar进行完全搜索。
当应用程序启动并加载此视图时,“集合对象”会从表中获取所有数据并将其加载到“项目对象”中。因为我需要两个领域进行搜索,所以我真的没有任何水合/脱水的东西;因此,完整的表在内存中。必须有更好的方法提供完整的搜索功能,但一次大大减少内存中的对象数量。
有什么想法吗?
修改
我想我应该进一步解释。
我已经在使用SQLite数据库了。我的问题是,将20,000条记录加载到内存中需要很长时间,应用程序看起来很慢。
此外,如果我在当前选择的任一侧只有100条记录,我如何搜索所有记录(包括不在内存中的记录)?
我会查看表格委托建议。
答案 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也是一个好主意。