在iOS中,我试图按天,月和年汇总核心数据字段。我找到了一些使用NSExpression
的示例,但没有找到这个具体请求。
这是我的数据对象:
data{
amount:NSNumber
date:NSDate
}
希望按日,月和年对数据进行分组,然后对金额求和。
感谢。
答案 0 :(得分:2)
您可以拥有日期组件的瞬态属性。您必须将这些作为瞬态和实体子类添加到托管对象模型。它们可以像这样计算:
-(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"];