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持つことができます。次のような述語でグループ化/フィルタリングすることもできます。yeardaysectionNameKeyPath

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

合計の計算は、キー パスを使用すると簡単です。

NSNumber *sum = [dataFor2000 valueForKeyPath:@"@sum.amount"];
于 2013-10-12T09:13:24.517 に答える