Iphone NSPredicate如何进行INNER JOIN?

Osc*_*mez 4 iphone join core-data nspredicate

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

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

SELECT*FROM Instruments INNER JOIN交易ON Instruments.ID = Deals.InstrumentID

我如何通过NSPredicate实现这一目标?任何帮助都会受到很大的影响.谢谢.

-Oscar

Bar*_*ark 12

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

所以,尽量不要考虑db表.你有一系列的Deal善意.你想要他们的财产吗?使用键值编码来获取这些实例和相关Instrument实例的属性.假设您有一个NSSet实例Deals,称为deals:

[deals valueForKey:@"dealProperty"];
Run Code Online (Sandbox Code Playgroud)

将为您提供每个实例NSSet的值.如果您想一次获得多个属性,可以使用.你只能使用这种方法获得"一级深度"的密钥,所以只有,例如'dealProperty1','dealProperty2',而不是'dealRelation.relationProperty'或'dealRelation.@count'.dealPropertyDeal-[NSObject(NSKeyValueCoding) dictionaryWithValuesForKeys:]

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

[deals valueForKeyPath:@"instrument.instrumentProperty"];
Run Code Online (Sandbox Code Playgroud)

会给你一组的值的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;
  }
}
Run Code Online (Sandbox Code Playgroud)

使用适当集合的枚举.