【问题标题】:Iphone NSPredicate how to do an INNER JOIN?Iphone NSPredicate 如何进行 INNER JOIN?
【发布时间】:2010-12-21 18:29:14
【问题描述】:

我一直在查看该站点中的文档和其他一些帖子,但我根本无法理解如何解决这个问题,这在 SQL 中实际上非常简单。

基本上我有 2 个实体 Instruments 和 Deals。并且“交易”使用“工具”来执行所需的操作。现在我想列出用于此交易的交易属性和工具属性。所以在 SQL 中我会这样做:

选择 * 来自仪器 INNER JOIN 优惠 ON Instruments.ID = Deals.InstrumentID

我将如何使用 NSPredicate 来完成此任务?任何帮助将不胜感激。谢谢。

-奥斯卡

【问题讨论】:

    标签: iphone core-data join nspredicate


    【解决方案1】:

    首先,您应该尽您所能摆脱 SQL 思维模式。 Core Data 不是 ORM。这是一个对象图管理框架,恰好使用 SQLite 作为一种可能的持久性后端。虽然您可以通过环境变量(用于调试)查看它使用的 SQL,但 SQL 是一个私有的实现细节。 Core Data 完全可以在没有任何 SQL 的情况下实现。

    所以,尽量不要考虑数据库表。你有一个Deal 实例的集合。你想要他们的属性吗?使用Key-value Coding 获取这些实例和相关Instrument 实例的属性。假设您有一个 DealsNSSet 实例,称为 deals

    [deals valueForKey:@"dealProperty"];
    

    将为您提供来自每个 Deal 实例的 dealProperty 值的 NSSet。如果您想一次获取多个属性,可以使用-[NSObject(NSKeyValueCoding) dictionaryWithValuesForKeys:]。您只能使用此方法获取“一级深度”的密钥,因此只能,例如“dealProperty1”、“dealProperty2”,但不是“dealRelation.relationProperty”或“dealRelation.@count”。

    要获得“嵌套”属性,只需使用键路径:

    [deals valueForKeyPath:@"instrument.instrumentProperty"];
    

    将为您提供一组与每个Deal 实例相关联的Instrument 实例的instrumentProperty 值,假设instrument 是从DealInstrument 的一对一关系.如果关系是一对多,您将获得一组instrumentProperty 值。

    你总是可以更明确地做到这一点(显然这段代码没有做任何事情,甚至在语法上也不正确,因为我省略了分号等,但它显示了大纲):

    for(Deal *deal in deals) {
      //use attribute access to get properties of deal and associated instrument
      deal.dealProperty
      deal.instrument.instrumentProperty //for one-to-one
    
      for(Instrument *instrument in deal.instruments) { //for one-to-many instruments
        instrument.instrumentProperty;
      }
    }
    

    使用适当集合的枚举。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 2014-03-13
      相关资源
      最近更新 更多