我有3个实体。文件夹,Feed& FeedItem
我需要获取包含Feed和Feed的文件夹,这些Feed和Feed都有未读的FeedItems
NSPredicate * predicate = [NSPredicate predicateWithFormat:@" feeds.@count > 0 AND feeds.feedItems.unread == 0 "];
我收到此错误
'NSInvalidArgumentException',原因:'这里不允许使用多对键'
如何构建这样的谓词?它有可能吗?
答案 0 :(得分:24)
它不喜欢feeds.feedItems.unread==0
,因为feeds
和feedItems
返回一个集合,因此谓词不知道要测试哪个对象。
尝试ANY feeds.feedItems.unread==0
。
然而,你正在倒退。在FeedItem
中获取所有unread==0
然后请求每个已获取项目的feed.folder
获取文件夹会更容易。
复杂谓词通常是一个坏主意,因为随着对象图的复杂性增加以及数据本身的大小增加,您永远无法预测它们执行的搜索的资源消耗。你应该尽可能地走人际关系。
再看一遍,看起来你需要一个SUBQUERY。尝试:
NSPredicate *p = [NSPredicate predicateWithFormat:@"(0 != SUBQUERY(feeds, $x, (0 != SUBQUERY($x.feedItems, $y, $y.unread==0).@count)).@count)"];
子查询的文档记录很少,但它们本质上是嵌套谓词。它们的格式为:
SUBQUERY(objects, singleObjectVariable, expression-for-single-object)
我相信子查询会返回集合,因此您可以使用它们上的任何集合运算符,并且可以嵌套它们。当你嵌套它们时,它们会走向关系图,这样你就可以任意深入它们。