使用JOIN访问NSPredicate中的核心数据实体关系

时间:2014-08-28 00:23:21

标签: core-data nspredicate

我最近从直接SQLite(使用FMDB)切换到核心数据,因此我将一堆查询重写为NSPredicate。我无法弄清楚如何使用谓词执行JOIN

我有一个条目实体,它与 Aircraft 实体有 to-one 关系。

条目有一个名为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'"];

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我明白了。我像以前一样提取完整的条目列表:

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

然后在该数组上,我应用另一个使用关系 Aircraft 实体的条件的谓词,如下所示:

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

然后我可以像以前那样总结持续时间,但是在新过滤的数组上:

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

哇噢! :)