1

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

当应用程序启动并加载此视图时,“集合对象”会从表中获取所有数据并将其加载到“项目对象”中。因为我需要两个字段来搜索,所以我真的没有什么可以补水/脱水的;因此,整个表都在内存中。必须有更好的方法提供完整的搜索功能,但同时大幅减少内存中的对象数量。

有任何想法吗?

编辑:

我想我应该进一步解释。

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

另外,如果我在当前选择的两边只有 100 条记录,我怎么能搜索所有记录(包括那些不在内存中的记录)?

我将研究表代表建议。

4

5 回答 5

3

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

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

于 2009-01-29T09:03:42.143 回答
2

也许我可以澄清一下其他人在说什么。

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

– tableView:cellForRowAtIndexPath:  
– tableView:numberOfRowsInSection:

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

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

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

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

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

 'select id, title, description from yourTable where title like ?'

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

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

祝你好运!

于 2009-02-04T04:06:33.997 回答
2

我会重新考虑您的应用程序的架构。

您必须记住,iPhone 与桌面应用程序不同,人们使用手机的方式不像普通电脑那样使用。iPhone一次使用几分钟,而不是几小时。没有人会想要滚动浏览 20,000 多个条目。老实说,我不确定是否有人愿意在桌面应用程序中这样做。

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

于 2009-01-29T00:06:23.383 回答
1

您应该尝试为您的表使用委托,并且仅按需将项目加载到内存中。如果只显示前十项,则操作系统只会要求您提供这些。

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

于 2009-01-28T22:24:45.147 回答
0

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

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

于 2009-01-28T22:35:31.040 回答