NSPredicate和NSInvalidArgumentException中的SUBQUERY

我在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. 

我build立了以下NSPredicate

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

通过这个谓词,我只需要抓取没有同步的书籍和他们的相关命令。

这是我收到的错误。

终止应用程序由于未捕获exception“NSInvalidArgumentException”,原因:“无法parsing格式string”isSync == 0和子查询(toBookOrders,$ x,$ x.toBook == SELF)“

有任何想法吗? 先谢谢你。

这是你的问题的症结所在:

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

如果你按照斯科特的说法把它分成两个子集,你会得到:

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

问题是每一个SUBQUERY都不会像谓词一样返回真或假。 它返回一个集合(一个数组),一个数组与真或假不是一回事。 因此,当你创build谓词的时候,你会得到一个错误,认为它是一个无效的格式,因为AND之后的东西不是一个谓词 。 这只是一个expression。

可能想要:

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

这会给你一个谓词来查找isSync为false的所有书籍,而Book的OrderBooks中至less有一本是Book。

isSync == 0SUBQUERY分离成单独的NSPredicate ,将它们添加到一个NSArray然后使用[NSCompoundPredicate andPredicateWithSubpredicates:array]将它们合并成一个单独的NSFetchSpecification