如何创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];
或者,使用更简单的谓词抽出一个子集,并在获取请求之外对其进行过滤。 即
- 为关系中的项目数量设置谓词,使其与您的比较集合中项目的数量相同。
- 取得结果
- 过滤这些结果以仅显示集合包含相同项目的结果。