1

在 iOS 中,我试图按日、月和年对核心数据字段求和。我发现了一些使用的示例NSExpression,但不是这个特定的请求。

这是我的数据对象:

data{
  amount:NSNumber
  date:NSDate
}

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

谢谢。

4

1 回答 1

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"];
于 2013-10-12T09:13:24.517 回答