Iphone NSPredicate如何进行INNER JOIN?

时间:2009-11-30 19:34:14

标签: iphone core-data join nspredicate

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

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

SELECT * 来自仪器 INNER JOIN特价 ON Instruments.ID = Deals.InstrumentID

如何使用NSPredicate完成此操作?任何帮助都会受到很大的影响。谢谢。

-Oscar

1 个答案:

答案 0 :(得分:12)

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

所以,尽量不要考虑db表。你有一组Deal个笨蛋。你想要他们的财产吗?使用Key-value Coding获取这些实例的属性以及相关的Instrument实例。假设您有NSSet Deals个实例,名为deals

[deals valueForKey:@"dealProperty"];

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

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

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

将为您提供与每个instrumentProperty实例关联的Instrument实例的Deal的一组值,假设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;
  }
}

使用适当集合的枚举。