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

Shu*_*dri 5 iphone cocoa cocoa-touch core-data

我有3个实体.Folder,Feed和FeedItem

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

NSPredicate * predicate = [NSPredicate predicateWithFormat:@" feeds.@count > 0 AND feeds.feedItems.unread == 0 "];
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

'NSInvalidArgumentException',原因:'to-many key不允许在这里'

我如何构造这样的谓词?有可能吗?

Tec*_*Zen 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)"];
Run Code Online (Sandbox Code Playgroud)

子查询的文档记录很少,但它们本质上是嵌套谓词.他们的格式为:

SUBQUERY(objects, singleObjectVariable, expression-for-single-object)
Run Code Online (Sandbox Code Playgroud)

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