2014-08-28 112 views
0

我最近從直接SQLite(使用FMDB)切換到核心數據,因此我將一堆查詢重寫爲NSPredicate s。我無法弄清楚如何用謂詞做一個JOIN使用JOIN訪問NSPredicate中的核心數據實體關係

我有一個進入實體,它有與飛機實體一對一關係。

進入有一個名爲duration飛機屬性有一個叫categoryClass

我可以總結一下所有的duration值這樣的(假設我建立contextrequest以前):

//SQLite equivalent: SELECT TOTAL(duration) FROM entry  

NSArray *entries = [context executeFetchRequest:request error:&error]; 
NSNumber *totalDuration = [entries valueForKeyPath:@"@sum.duration"]; 

但現在我要總結的所有duration值某些種類飛機

//SQLite equivalent: SELECT TOTAL(duration) FROM entry LEFT JOIN aircraft ON entry.aircraftRegistration = aircraft.aircraftRegistration WHERE aircraft.categoryClass != 'Simulator' AND aircraft.categoryClass != 'Flight Training Device'" 

NSArray *entries = [context executeFetchRequest:request error:&error]; 
NSNumber *totalDuration = [entries valueForKeyPath:@"@sum.duration ?????"]; 

我猜這是不可能的速記符號@sum,我可能要使用NSPredicate在我的讀取請求,但我無法弄清楚如何做一個謂詞LEFT JOIN之一:

//This results in a crash 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entry.aircraft.categoryClass != 'Simulator'"]; 

誰能幫助?

回答

0

我想通了。我拉項的完整列表,再像以前那樣:

NSArray *entries = [context executeFetchRequest:request error:&error]; 

然後該陣列上,我申請使用條件的關係飛機實體一次像這樣的斷言:

NSPredicate *predicateWithoutSim = [NSPredicate predicateWithFormat:@"aircraft.categoryClass != 'Simulator'"]; 
NSArray *entriesWithoutSim = [entries filteredArrayUsingPredicate:predicateWithoutSim]; 

而且那麼我可以像我以前那樣總結持續時間,但在新過濾的陣列上:

totalDuration = [entriesWithoutSim valueForKeyPath:@"@sum.duration"]; 

嗚呼! :)