CoreDataで集計関数を使う
背景
前回のNSExpressionを使って今度はCoreDataで集計関数を使用する方法を調べたのでメモ。
サンプル
下記のデータ構造とデータを格納しているSeminarsテーブルがあると仮定する。
Seminars
date | seminar | charge |
---|---|---|
2014/05/01 | SeminarA | 1,000 |
2014/05/02 | SeminarB | 1,500 |
2014/05/01 | SeminarC | 500 |
2014/05/03 | SeminarD | 2,000 |
2014/05/02 | SeminarE | 0 |
2014/05/01 | SeminarF | 0 |
日付ごとのセミナー件数を取得してみる。
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Seminars" inManagedObjectContext:_managedObjectContext]; //集計対象カラムseminar NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"seminar"]; //集計関数countを指定 NSExpression *countExpression = [NSExpression expressionForFunction:@"count:" arguments:@[keyPathExpression]]; //集計式の対象(NSExpressionDescription) NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; [expressionDescription setName:@"seminarCount"]; [expressionDescription setExpression:countExpression]; [expressionDescription setExpressionResultType:NSInteger32AttributeType]; [searchFetchRequest setPropertiesToFetch:@[@"date", expressionDescription]]; //Group By [searchFetchRequest setPropertiesToGroupBy:@[@"date"]]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES]; [searchFetchRequest setSortDescriptors:@[sortDescriptor]]; [searchFetchRequest setResultType:NSDictionaryResultType]; NSArray *fetchedObjects = [_managedObjectContext executeFetchRequest:searchFetchRequest error:nil]; NSLog(@"出力結果:%@", fetchedObjects);
出力結果
({ date = "2014/05/01"; seminarCount = 3; }, { date = "2014/05/02"; seminarCount = 2; }, { date = "2014/05/03"; seminarCount = 1; })
ごちゃごちゃと面倒な印象。
やはりMagicalRecordを使うべしですかね。