复杂核心数据谓词与多对多关系

时间:2010-08-15 12:02:42

标签: iphone cocoa cocoa-touch core-data

我有3个实体。文件夹,Feed& FeedItem

我需要获取包含Feed和Feed的文件夹,这些Feed和Feed都有未读的FeedItems

NSPredicate * predicate = [NSPredicate predicateWithFormat:@" feeds.@count > 0 AND feeds.feedItems.unread == 0 "];

我收到此错误

'NSInvalidArgumentException',原因:'这里不允许使用多对键'

如何构建这样的谓词?它有可能吗?

1 个答案:

答案 0 :(得分:24)

它不喜欢feeds.feedItems.unread==0,因为feedsfeedItems返回一个集合,因此谓词不知道要测试哪个对象。

尝试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)

我相信子查询会返回集合,因此您可以使用它们上的任何集合运算符,并且可以嵌套它们。当你嵌套它们时,它们会走向关系图,这样你就可以任意深入它们。