核心数据:如何进行第二次获取仅限于先前获取的结果?

Posted

技术标签:

【中文标题】核心数据:如何进行第二次获取仅限于先前获取的结果?【英文标题】:Core Data: How to do a second fetch limited to the results of an earlier fetch? 【发布时间】:2011-05-04 01:49:38 【问题描述】:

这似乎是一个微不足道的问题,但我是 Core Data 和数据库的新手。

在我的应用程序中,我执行提取并显示结果。然后,根据用户输入,我需要剔除这些结果。也就是说,我只需要对第一次获取的结果进行新的搜索,但要基于完全不同的参数。 (有时,第二次获取将基于一个属性,有时基于一对多关系。)执行此操作的最佳方法是什么?

我已经想出了两种选择,但似乎都不是很好:

    在第一次提取中,预取第二次提取所需的所有数据。然后,不要进行第二次提取,而只是遍历第一次提取的结果数组,寻找与第二次提取的新条件匹配的内容。 这种方法的缺点是我必须在数组中跋涉,并且没有利用 Core Data 的性能优势。

    对于第二次提取,忽略第一次并使用由第一次提取和第二次提取的条件组成的复合谓词执行全新提取。 这有一个缺点,Core Data 必须再次查看整个数据库才能执行它已经进行的相同搜索。

有没有办法在第二次提取中告诉 Core Data 仅通过之前提取中返回的实体对象进行搜索?

【问题讨论】:

第一次获取是否足够快?如果是这样,那么使用复合谓词的第二次提取几乎肯定会很好。似乎这可能是过早的优化。 @Adam Eberbach:实际上,现在我正在重新设计数据库以优化我需要执行的提取类型。所以,我不知道。但是,我想知道是否有一种我缺少的标准方法。必须对先前搜索的结果集进行第二次搜索,这似乎是一件很常见的事情。 【参考方案1】:

你已经很清楚了。

对于第一个选项,它非常简单。你有你的对象数组,你可以做-[NSArray filteredArrayUsingPredicate:]-[NSMutableArray filterUsingPredicate:] 来根据你的需要减少数组。您不需要自己实际遍历数组;只需像处理获取请求一样使用谓词即可。

对于第二个选项,这也很简单。您从您的第一个请求中获取谓词,并使用您的新谓词 AND 它:

NSPredicate *original = ...;
NSPredicate *newCondition = ...;
NSPredicate *newFilter = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:original, newCondition, nil]];

就个人而言,我通常发现第一个选项总体上更简单。

【讨论】:

谢谢,不知道用谓词过滤数组的方法:非常好。但是,过滤数组不如直接在数据库中执行相同的工作有效。问题是:是否可以在数据库中进行第二次提取,以某种方式告诉 Core Data 只查看第一次提取的结果?也就是说,不必使用复合谓词重新进行第一次提取? 或者,是否有可能以某种方式将第一次获取的结果保存在 Core Data 中?然后只对这些结果而不是整个数据库运行第二次提取? @salo.dm 你说“过滤数组不如直接在数据库中做同样的工作高效”,但你证明了吗?您是否尝试过自己过滤数组并发现性能比自己执行查询差?至于“保存结果”,Core Data(AFAIK)没有办法做到这一点。 不,我还没有进行任何测试。现在只是想提出一个好的设计,然后进行调整。当我说数据库更高效时,我只是在观看有关优化核心数据的 WWDC 视频和 iTunes 上的斯坦福课程。他们都建议在 Core Data 中尽可能多地进行过滤,因为 SQL 在这方面特别有效。 ...但是,我感觉数据库并没有按照我描述的方式进行顺序获取。你说的是这个吗? @salo.dm 我从未在 SQLite API 中看到任何暗示它可以像您描述的那样执行“顺序提取”的东西(C 绑定:sqlite.org/c3ref/intro.html)。如果 SQLite 不支持它,Core Data 所做的任何事情都必须在代码中进行模拟(通过执行两个请求或像我展示的那样复合谓词)

以上是关于核心数据:如何进行第二次获取仅限于先前获取的结果?的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode:Database 89.获取最近第二次的活动

如何使用Javascript根据先前的下拉值显示第二个下拉列表

Microsoft Graph API calendarView 是不是仅限于一个月?如何获取所有事件?

获取具有类型过滤功能的 Android 联系人,仅限于特定帐户

OLAP SSAS MDX 如何获取先前选定/可见日期的度量值

如何进行查询以仅获取在值范围内具有 N 个数字的结果?