NSPredicate中的SUBQUERY和NSInvalidArgumentException

Lor*_*o B 5 core-data one-to-many nspredicate ios

我在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.
Run Code Online (Sandbox Code Playgroud)

我设置了以下内容NSPredicate.

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

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

这是我收到的错误.

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

有任何想法吗?先感谢您.

Dav*_*ong 25

这是你问题的症结所在:

@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)"
Run Code Online (Sandbox Code Playgroud)

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

  • 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"
Run Code Online (Sandbox Code Playgroud)

这会给你一个谓词,找到所有书籍isSync都是假的,至少有一本书OrderBooks就是那本书.

  • @Flex_Addicted是的,你可以做`...和任何toBookOrders.toBook == SELF` (2认同)