iOS核心数据按日期,月份汇总数据

时间:2013-10-12 03:06:53

标签: ios objective-c core-data nsexpression

在iOS中,我试图按天,月和年汇总核心数据字段。我找到了一些使用NSExpression的示例,但没有找到这个具体请求。

这是我的数据对象:

data{
  amount:NSNumber
  date:NSDate
}

希望按日,月和年对数据进行分组,然后对金额求和。

感谢。

1 个答案:

答案 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);
}

使用上述方案,这就是你真正需要的。但是拥有明确的yearmonth属性将使你的代码更具可读性。

现在要在NSFetchedResultsController中进行分组,您可以yearday作为sectionNameKeyPath。您还可以使用以下谓词进行分组/过滤:

NSArray *dataFor2000 = [allData filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:@"year = %@", @2000]];

使用关键路径计算总和是微不足道的:

NSNumber *sum = [dataFor2000 valueForKeyPath:@"@sum.amount"];