hachinoBlog

hachinobuのエンジニアライフ

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を使うべしですかね。