2009-11-30 68 views
4

我一直在寻找通过该网站的文档和一些其他帖子,但我根本无法理解如何解决这个问题,这在SQL中实际上很简单。Iphone NSPredicate如何做一个INNER JOIN?

基本上我有2个实体仪器和交易。 “交易”使用“工具”执行所需的操作。现在我想列出交易属性以及用于此交易的工具属性。因此,在SQL我会做:

SELECT * FROM 仪器 INNER JOIN优惠 ON Instruments.ID = Deals.InstrumentID

我将如何做到这一点与NSPredicate?任何帮助都会大大降低。谢谢。

-Oscar

回答

12

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

所以,尽量不要用数据库表来思考。你有一个Deal isntances的集合。你想要他们的财产?使用Key-value Coding可以获取这些实例的属性以及相关的Instrument实例。假设你有一个Deals例如NSSet名为deals

[deals valueForKey:@"dealProperty"]; 

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

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

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

会给你一个与每个Deal实例相关联的Instrument实例的instrumentProperty的值,假设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; 
    } 
} 

使用枚举适当的集合。