我有一个Core Data实体,OrderItem与另一个实体OrderItemOption有很多关系。我想找到一个与两个特定OrderItemOptions有关系的特定OrderItem。我如何在核心数据中做到这一点?
OrderItemOptions有一个类型代码和选项代码,本质上是一个键/值。我正在寻找带有选项(typecode = OptionSet1,optionCode = BT)和另一个选项(typecode = OptionSet2,optionCode = CT)的orderItem。
问题是如何在查询中区分第一个OrderItemOption对象和第二个。
我能够提出一个SQL查询来完成我想要的工作。它使用别名来执行表与自身的连接。如何在Core Data中执行等效操作?
sql语句是:
select * from zorderItem, zorderItemOption one, zorderItemOption two where
one.zorderitem = zorderItem.z_pk and
one.zoptiontypecode='OptionSet1' and one.zoptioncode='BT' and
two.zorderitem =zorderitem.z_pk and
two.zoptiontypecode='OptionSet2' and two.zoptioncode='CT';
我认为我并不完全遵循谓词中'ANY'关键字背后的语义。我能够接近,
NSPredicate *pre = [NSPredicate predicateWithFormat:
@"order == %@ and
(any options.optionTypeCode == %@ and any options.optionCode == %@)
and
(any options.optionTypeCode == %@ and any options.optionCode == %@)",
order, @"OptionSet1", @"BT", @"OptionSet2", @"CT"];
但是当optionCodes反转时它也匹配。
我尝试在每个括号表达式之外对'ANY'进行分解,但这导致了一个解析异常。
也许一个更简单的例子也很有趣。如果我有一个与Books有多对多关系的Author实体怎么办?我如何创建一个谓词来说,找到写过“Book1”这本书和“Book2”这本书的作者?
答案 0 :(得分:0)
有人在Apple开发者论坛上回答https://devforums.apple.com/message/659752#659752
在此重复发帖,
听起来你正在寻找的是一个子查询。子查询的解释之一:http://funwithobjc.tumblr.com/post/2726166818/what-the-heck-is-subquery
我认为它会像
order == %@ AND
subquery(orderItemOptions, $one, $one.typeCode = %@ && $one.optionCode = %@).@count >0 AND
subquery(orderItemOptions, $two, $two.typeCode = %@ && $two.optionCode = %@).@count >0
表示谓词。虽然我不确定你为什么要在你的尝试中使用order ==%@子句,但我只是将它保存在带有子查询的版本中以保持一致...