NSPredicate中的SUBQUERY和NSInvalidArgumentException

时间:2012-03-21 11:44:21

标签: ios core-data nspredicate one-to-many

我在Core Data中设置了以下模型。

Book has a to-many relationship, called toBookOrders, with OrderBook entity. The inverse is called toBook.
Book has a BOOL value property called isSync.

我设置了以下NSPredicate

NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:moc];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)"];

通过这个谓词,我只需要抓取尚未同步的书籍和他们的相对订单。

这是我收到的错误。

  

由于未捕获的异常而终止应用   'NSInvalidArgumentException',原因:'无法解析格式   字符串“isSync == 0 AND SUBQUERY(toBookOrders,$ x,$ x.toBook == SELF)”

有什么想法吗?提前谢谢。

2 个答案:

答案 0 :(得分:24)

以下是问题的症结所在:

@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)"

如果你把它分成两个子预测,正如斯科特建议的那样,你会得到:

  • isSync == 0
  • SUBQUERY(toBookOrders, $x, $x.toBook == SELF)

问题是每个SUBQUERY都不会返回true或false,因为谓词必须。它返回一个集合(一个数组),一个数组与true或false不同。因此,当您创建谓词时,您会收到一个错误,即它是一种无效的格式,因为AND 之后的内容不是谓词。这只是一种表达方式。

可能想要:

@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF).@count > 0"

这会为您提供一个谓词来查找isSync为假的所有图书,并且至少有一本图书的OrderBooks就是该图书。

答案 1 :(得分:-2)

isSync == 0SUBQUERY分隔为单独的NSPredicate,将其添加到NSArray,然后使用[NSCompoundPredicate andPredicateWithSubpredicates:array]将它们合并为一个NSFetchSpecification传递给您的{{1}}。