我一直在查看本网站的文档和其他帖子,但我根本无法理解如何解决这个问题,这在SQL中实际上非常简单。
基本上我有2个实体仪器和交易。并且“交易”使用“工具”来执行期望的操作。现在我想列出交易属性和用于此交易的工具属性。所以在SQL中我会这样做:
SELECT * 来自仪器 INNER JOIN特价 ON Instruments.ID = Deals.InstrumentID
如何使用NSPredicate完成此操作?任何帮助都会受到很大的影响。谢谢。
-Oscar
答案 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
是一对一的关系从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;
}
}
使用适当集合的枚举。