如何创建Core Data谓词来测试关系是否包含所有给定对象?

时间:2012-10-26 10:11:30

标签: core-data nspredicate nsset

设定:

我有一个与B具有to-many关系的Core Data对象A.调用关系“items”。因此,a.items返回与A相关的所有B-。

现在,我手动编写了B对象的NSSet“itemSet”。

我想做以下事情:

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

如何为此构造谓词?我试过这个:

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

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

此:

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

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

那么用集合过滤关系的正确方法是什么?

2 个答案:

答案 0 :(得分:20)

以下谓词可以起作用:

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

谓词首先检查项目数是否等于给定itemSet的大小,然后检查itemSet成员的项目数是否也等于itemSet。如果两者都为真,那么items必须等于itemSet

答案 1 :(得分:0)

你试过了吗?

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

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

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