Core data 如何创建一个核心数据谓词来测试一个关系是否包含所有给定对象?

Core data 如何创建一个核心数据谓词来测试一个关系是否包含所有给定对象?,core-data,nspredicate,nsset,Core Data,Nspredicate,Nsset,设置: 我有一个核心数据对象a,它与B有一对多的关系。将这种关系称为“项”。因此,a.items返回与a关联的所有B-s 现在,我有一个手动合成的NSB对象集“itemSet” 我想做以下工作: return all A objects whose "items" relation exactly matches itemSet 我如何为它构造一个谓词?我试过这个: NSPredicate *predicate = [NSPredicate predicateWithFormat:

设置:

我有一个核心数据对象a,它与B有一对多的关系。将这种关系称为“项”。因此,a.items返回与a关联的所有B-s

现在,我有一个手动合成的NSB对象集“itemSet”

我想做以下工作:

return all A objects whose "items" relation exactly matches itemSet
我如何为它构造一个谓词?我试过这个:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"(ALL items in %@)", itemSet];
但这只是给了我
不支持的谓词(null)

这:

告诉我谓词的
未实现SQL生成。有意思,但没有帮助

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

您是否尝试过:

NSPredicate *predicate = [NSPredicate predicateWithFormate:@"items == %@", itemSet];
或者,使用更简单的谓词提取一个子集,并在fetch请求之外对其进行过滤。i、 e

  • 将关系中的项数的谓词设置为与比较集中的项数相同
  • 取得结果
  • 过滤这些结果以仅显示集合中包含相同项的结果

  • 以下谓词可能有效:

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

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

    是。这就产生了另一个例外:
    ***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“此处不允许使用多个密钥”
    手动筛选(先按计数提取,然后筛选)肯定是一个选项,但会创建不必要的CD流量。我想知道这个谓词是否可行。这很有效。在哪里可以了解有关子查询的更多信息?官方的谓词文档在这方面有点少。@Jaanus:恐怕我没有更好的参考资料。我主要是通过努力理解别人的答案来学习的。我遇到的问题与括号使用不足有关。谢谢你的回答,@MartinR
    [NSPredicate predicateWithFormat:@"(items.@count == %d) AND (SUBQUERY(items, $x, $x IN %@).@count == %d)",
                          itemSet.count, itemSet, itemSet.count];