我在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)”
有什么想法吗?提前谢谢。
答案 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 == 0
和SUBQUERY
分隔为单独的NSPredicate
,将其添加到NSArray
,然后使用[NSCompoundPredicate andPredicateWithSubpredicates:array]
将它们合并为一个NSFetchSpecification
传递给您的{{1}}。