【问题标题】:Complex Core Data predicate with to-many relation具有多对多关系的复杂核心数据谓词
【发布时间】:2011-03-30 01:44:30
【问题描述】:

我有 3 个实体。文件夹、Feed 和 FeedItem

我需要获取包含未读 FeedItem 的提要和提要的文件夹

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

我收到此错误

'NSInvalidArgumentException',原因:'to-many key not allowed here'

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

【问题讨论】:

  • 您可以尝试在异常对象的userInfo 中查找谓词,您可以检查该表达式的哪个部分无效。 predicateWithFormat: 创建一棵 NSPredicates 树(在您的情况下由 NSComparisonPredicates 和 NSCompoundPredicates 组成)并返回该树的根;如果异常对象在其userInfo 中有谓词,它将是该树的节点之一,对应于该表达式的某些部分。

标签: iphone cocoa cocoa-touch core-data


【解决方案1】:

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

试试ANY feeds.feedItems.unread==0

但是,您正在倒退。获取所有FeedItem where 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)

我相信子查询会返回集合,因此您可以在它们上使用任何集合运算符并且可以嵌套它们。当您嵌套它们时,它们会遍历关系图,因此您可以使它们任意深。

【讨论】:

  • 我试过这个,但得到异常'这里不允许多对多键'。我不能向后做的原因是因为 feedItems 可能很大。
  • 尝试了子查询方法。收到此错误无法为谓词生成 SQL (0 != SUBQUERY(feeds, $x, 0 != SUBQUERY($x.feedItems, $y, $y.unread == 0).@count).@count) ( RHS 上的问题)'
  • 你去掉了一个括号。它应该是 '(0 != SUBQUERY(feeds, $x, ...(...0 != SUBQUERY($x.feedItems, $y, $y.unread == 0).@count).@count )` 其中“...”表示缺少的括号。
  • 记录不充分?这一定是今年的轻描淡写!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多