4

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

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

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

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

-奥斯卡

4

1 回答 1

12

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

所以,尽量不要考虑数据库表。你有一个实例集合Deal。你想要他们的属性吗?使用键值编码来获取这些实例和相关Instrument实例的属性。假设您有一个名为的NSSet实例:Dealsdeals

[deals valueForKey:@"dealProperty"];

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

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

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

将为您提供一组与每个实例关联instrumentProperty的实例的值,假设从到是一对一的关系。如果关系是一对多的,您将获得一组值。InstrumentDealinstrumentDealInstrumentinstrumentProperty

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

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

使用适当集合的枚举。

于 2009-11-30T20:50:04.670 回答