代码之家  ›  专栏  ›  技术社区  ›  Oscar Gomez

iphone nspredicate如何进行内部连接?

  •  4
  • Oscar Gomez  · 技术社区  · 15 年前

    我一直在浏览这个站点中的文档和其他一些文章,但是我完全不理解如何解决这个问题,这在SQL中实际上非常简单。

    基本上我有两个实体工具和交易。“交易”使用“仪器”来执行所需的操作。现在我要列出交易属性和用于此交易的工具属性。所以在SQL中,我会这样做:

    选择* 来自仪器 内部加入交易 在instruments.id=deals.instrumentid上

    我如何通过nspredicate来完成这个任务?任何帮助都将得到极大的重视。谢谢您。

    -奥斯卡

    1 回复  |  直到 10 年前
        1
  •  12
  •   rptwsthi    10 年前

    首先,您应该尽可能地摆脱SQL思维模式。核心数据 不是 奥姆它是一个对象图管理框架, 恰好发生 使用sqlite作为一个可能的持久性后端。尽管您可以通过环境变量(用于调试)查看它使用的SQL,但SQL是一个私有实现细节。核心数据完全可以在没有任何SQL的情况下实现。

    所以,尽量不要用DB表来思考。你收集了 Deal 相互关系。你想要他们的财产吗?使用 Key-value Coding 获取这些实例的属性和相关的 Instrument 实例。假设你有一个 NSSet 实例 Deals ,叫做 deals 以下内容:

    [deals valueForKey:@"dealProperty"];
    

    会给你一个 NSET 价值观的 dealProperty 从每个 迪尔 实例。如果要同时获取多个属性,可以使用 -[NSObject(NSKeyValueCoding) dictionaryWithValuesForKeys:] . 使用此方法只能获取“一级深度”的键,因此只能获取“dealproperty1”、“dealproperty2”等键,而不能获取“dealrelation.relationproperty”或“dealrelation@count”。

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

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

    将为您提供一组 instrumentProperty 仪器 与每个关联的实例 迪尔 实例,假设 instrument 是一对一的关系 迪尔 仪器 . 如果关系是一对多的,您将得到一组 仪器属性 价值观。

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

    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;
      }
    }
    

    使用适当集合的枚举。