0

我有一个核心数据实体 OrderItem,它与另一个实体 OrderItemOption 有一对多的关系。我想找到一个与两个特定 OrderItemOptions 有关系的特定 OrderItem。我如何在核心数据中做到这一点?

OrderItemOptions 有一个 typecode 和 optioncode,本质上是一个键/值。我正在寻找一个带有选项(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"];

但是当逆转的选件代码倒置时,它也匹配。

我尝试在每个括号表达式之外考虑“ANY”,但这导致了解析异常。

也许一个更简单的例子也会很有趣。如果我有一个与 Books 有一对多关系的 Author 实体怎么办。我将如何创建一个谓词来表示,找到同时写了名为“Book1”的书和名为“Book2”的书的作者?

4

1 回答 1

0

有人在苹果开发者论坛上回答,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 == %@ 子句,但我只是将它保留在带有子查询的版本中以保持一致......

于 2012-05-11T19:16:03.633 回答