首先,您应该尽您所能摆脱 SQL 思维模式。 Core Data 不是 ORM。这是一个对象图管理框架,恰好使用 SQLite 作为一种可能的持久性后端。虽然您可以通过环境变量(用于调试)查看它使用的 SQL,但 SQL 是一个私有的实现细节。 Core Data 完全可以在没有任何 SQL 的情况下实现。
所以,尽量不要考虑数据库表。你有一个Deal 实例的集合。你想要他们的属性吗?使用Key-value Coding 获取这些实例和相关Instrument 实例的属性。假设您有一个 Deals 的 NSSet 实例,称为 deals:
[deals valueForKey:@"dealProperty"];
将为您提供来自每个 Deal 实例的 dealProperty 值的 NSSet。如果您想一次获取多个属性,可以使用-[NSObject(NSKeyValueCoding) dictionaryWithValuesForKeys:]。您只能使用此方法获取“一级深度”的密钥,因此只能,例如“dealProperty1”、“dealProperty2”,但不是“dealRelation.relationProperty”或“dealRelation.@count”。
要获得“嵌套”属性,只需使用键路径:
[deals valueForKeyPath:@"instrument.instrumentProperty"];
将为您提供一组与每个Deal 实例相关联的Instrument 实例的instrumentProperty 值,假设instrument 是从Deal 到Instrument 的一对一关系.如果关系是一对多,您将获得一组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;
}
}
使用适当集合的枚举。