在 iOS 中,我试图按日、月和年对核心数据字段求和。我发现了一些使用的示例NSExpression
,但不是这个特定的请求。
这是我的数据对象:
data{
amount:NSNumber
date:NSDate
}
希望按日、月和年对数据进行分组,然后对金额求和。
谢谢。
在 iOS 中,我试图按日、月和年对核心数据字段求和。我发现了一些使用的示例NSExpression
,但不是这个特定的请求。
这是我的数据对象:
data{
amount:NSNumber
date:NSDate
}
希望按日、月和年对数据进行分组,然后对金额求和。
谢谢。
您可以为日期组件设置瞬态属性。您必须将它们作为瞬态添加到托管对象模型和实体子类中。它们可以这样计算:
-(NSNumber*)year {
NSCalendar *greg = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [greg components:NSYearCalendarUnit fromDate:self.date];
return @(comps.year);
}
通过设计一个以某种原始数字形式(例如天)捕获日期相关部分的方案,对月和日进行等效处理:
-(NSNumber*)day {
NSCalendar *greg = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [greg
components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
fromDate:self.date];
return @(comps.year*10000+comps.month*100+comps.day);
}
(使用上述方案,这确实是您所需要的。但是具有显式year
和month
属性将使您的代码更具可读性。)
现在要分组,NSFetchedResultsController
您可以拥有year
或day
作为sectionNameKeyPath
. 您还可以使用如下谓词进行分组/过滤:
NSArray *dataFor2000 = [allData filteredArrayUsingPredicate:
[NSPredicate predicateWithFormat:@"year = %@", @2000]];
使用关键路径计算总和是微不足道的:
NSNumber *sum = [dataFor2000 valueForKeyPath:@"@sum.amount"];