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

时间:2011-05-04 01:49:39

标签: iphone sqlite core-data nspredicate

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

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

我已经找到了两个选项来做到这一点,但似乎都不是很好:

  1. 在第一次提取中,预取第二次提取所需的所有数据。然后,不要进行第二次提取,而只是迭代第一次提取的结果数组,寻找与第二次提取的新条件的匹配。 此方法的缺点是我必须通过数组跋涉而不利用Core Data的性能优势。

  2. 对于第二次获取,忽略第一次获取并使用由第一次获取的条件和第二次获取的条件组成的复合谓词进行全新的获取。 这样做的缺点是,核心数据必须再次通过整个数据库进行相同的搜索。

  3. 在第二次获取中,有没有办法告诉Core Data只搜索先前获取中返回的实体对象?

1 个答案:

答案 0 :(得分:1)

你已经弄明白了。

对于第一个选项,它非常简单。您拥有自己的对象数组,并且可以根据需要执行-[NSArray filteredArrayUsingPredicate:]-[NSMutableArray filterUsingPredicate:]来减少数组。您不需要自己迭代遍历数组;只需像使用获取请求一样使用谓词。

对于第二种选择,这也很容易。您从第一个请求中获取谓词,并使用新谓词AND获取谓词:

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

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