2011-05-02 27 views
0

我有一个Cocoa Mac应用程序,通过CoreData将搜索字段和集合视图绑定到一个sqlite表。该表包含几十万条带有按名称索引的文本字段(名称,地点,...)的记录。我在搜索字段绑定中使用BEGINSWITH谓词来选择十几个记录以在集合视图中显示。一切工作正常,但问题是,CoreData在第一个查询请求中将整个表加载到内存中,然后才进行必要的记录过滤以显示,这意味着用户需要相当长的时间。CoreData和大表

有没有办法设置CoreData,使整个表不会加载到内存中?理想情况下,我只想从搜索字段中每个查询的字母排序记录的范围中提取前100个项目。

+2

一些建议。您没有“通过CoreData绑定到sqlite表的集合视图。”核心数据不是SQL。实体不是表格。对象不是行。属性不是列。关系不是连接。核心数据是一个对象图管理系统,它可能会或可能不会持久化对象图,并且可能会或可能不会在后台使用SQL来做到这一点。试图用SQL语言来思考核心数据会导致你完全误解核心数据,并导致很多悲伤和浪费时间。 – TechZen 2011-05-02 20:34:04

+0

是什么让你认为“CoreData在第一个查询中将整个表加载到内存中?”?核心数据不能像那样工作。你只是假设,因为该应用程序很慢? – TechZen 2011-05-02 20:34:38

+0

@TechZen:我明白你的观点。我的问题是,我的微不足道的应用程序在启动时很慢。我想通过将一些调试日志记录放入一个NSArrayController fetchWithRequest方法覆盖,并发现在第一个请求时整个表确实被加载到数组控制器中,但我只想显示前100个记录我的收藏视图。我是Cocoa的新手,我很确定这只是一个不恰当的设置问题。我很欣赏任何可以指引我朝着正确方向的暗示。 – mschuster 2011-05-03 14:09:34

回答

2

在iOS上,这将通过使用NSFetchedResultsController来实现。以下问题描述了Mac等效控制器(如NSArrayController):NSFetchedResultsController Mac OSX Cocoa equivalent

EDIT

按下面我的意见,一个NSFetchRequest应该以与阵列控制器一起创建。然后可以使用fetchLimitfetchOffset来配置,以确定返回多少个提取结果。

+0

是的,我一直在使用NSArrayController。问题在于它使用查询填充: 从mytable中选择名称; 这是超过100K条记录。 我想填充类似的东西: 从mytable中选择名称,其中名称像'j%'命令的名称限制为100; ,以便数组控制器只携带那些实际显示在我的集合视图中的条目。 – mschuster 2011-05-02 16:22:44

+2

@mschuster:要限制返回的结果数量,请将您的'NSArrayController'配置为使用'NSFetchRequest'。你可以继承你的'NSArrayController'并覆盖'fetchWithRequest:merge:error:'方法。你的'NSFetchRequest'可以用'fetchLimit'和'fetchOffset'来配置,以确定fetch应该返回多少结果。 – Stuart 2011-05-02 18:02:37

+0

+1数组控制器应该只能在实时用于立即显示tableview的托管对象中进行读取和错误操作。设置fetchLimit等帮助更多,虽然根据我的经验,它很少需要数组控制器。 – TechZen 2011-05-02 20:43:41

0

确保您将抓取请求设置为仅抓取为故障。这样,只有被主动访问的属性的对象才会被完全加载到内存中。