如何创build一个核心数据谓词来testing一个关系包含所有给定的对象?

build立:

我有一个与B有多对多关系的核心数据对象A.调用关系“items”。 所以,a.items返回与A相关的所有Bs。

现在,我有一个B对象的手动组合的NSSet“itemSet”。

我想要做到以下几点:

return all A objects whose "items" relation exactly matches itemSet 

我如何构build一个谓词呢? 我试过这个:

 NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(ALL items in %@)", itemSet]; 

但是,这只是给了我Unsupported predicate (null)

这个:

 NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(items in %@)", itemSet]; 

告诉我unimplemented SQL generation for predicate 。 有趣,但没有帮助。

那么过滤一个关系的正确方法是什么?

以下谓词可以工作:

 [NSPredicate predicateWithFormat:@"(items.@count == %d) AND (SUBQUERY(items, $x, $x IN %@).@count == %d)", itemSet.count, itemSet, itemSet.count]; 

谓词首先检查项目的数量是否与给定itemSet的大小相等,然后检查itemSet成员的项目数量是否也等于itemSet的大小。 如果两者均为true,则items必须等于itemSet

你有没有尝试过:

 NSPredicate *predicate = [NSPredicate predicateWithFormate:@"items == %@", itemSet]; 

或者,使用更简单的谓词抽出一个子集,并在获取请求之外对其进行过滤。 即

  1. 为关系中的项目数量设置谓词,使其与您的比较集合中项目的数量相同。
  2. 取得结果
  3. 过滤这些结果以仅显示集合包含相同项目的结果。