2009-11-30 55 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; 
    } 
} 

使用枚舉適當的集合。