我最近从直接SQLite(使用FMDB)切换到核心数据,因此我将一堆查询重写为NSPredicate
。我无法弄清楚如何使用谓词执行JOIN
。
我有一个条目实体,它与 Aircraft 实体有 to-one 关系。
条目有一个名为duration
的属性,飞机有一个名为categoryClass
的属性。
我可以总结所有duration
这样的值(假设我之前设置了context
和request
):
//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 :(得分: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"];
哇噢! :)