检索与两个子对象具有特定关系的Core Data对象

时间:2012-05-10 22:01:05

标签: sql core-data nspredicate

我有一个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”这本书的作者?

1 个答案:

答案 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 ==%@子句,但我只是将它保存在带有子查询的版本中以保持一致...