Core Data を使用するアプリでフェッチ リクエストを作成する際に大きな問題が発生しています。ソングとジャンルの 2 つのエンティティがあります。私のモデルは次のようになります。
Song エンティティの playCount 属性を使用して、上位 5 位のアーティストを返すクエリを作成する必要があります。最後に、結果を Artist.name 属性でグループ化する必要があります。
つまり、結果の辞書は次のようになります。
result_array('my_first_artist' => '3200', 'my_second_artist' => '12');
上記の Core Data のように結果の配列を達成できないことはわかっていますが、同様のものがあれば素晴らしいでしょう。
私はこのコードで試しました:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Artist" inManagedObjectContext:context]];
[request setPropertiesToFetch:@[@"name", @"songs.@sum.playCount"]];
[request setPropertiesToGroupBy:@[@"name"]];
[request setResultType:NSDictionaryResultType];
[request setSortDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"songs.@sum.playCount" ascending:NO]]];
[request setFetchLimit:5];
しかし、それは常に部分的に例外をスローします@"songs.@sum.playCount"
。だから私の質問は次のとおりです。属性を使用して関係オブジェクトを合計するにはどうすればよいですか?
どんな提案も素晴らしいでしょう。
編集:
「Martin R」のおかげで、問題の一部が解決されました。I を使用NSExpressionDescription
するとフェッチできますが、エンティティNSSortDescriptor
の属性ではないキーでの並べ替えはできません。NSManagedObject
誰かがそれを必要とする場合、これが解決策です:
NSExpression *aggregateExpression = [NSExpression expressionForFunction:@"sum:"
arguments:@[[NSExpression expressionForKeyPath:@"songs.playCount"]]];
NSExpressionDescription *aggregateDescription = [[NSExpressionDescription alloc] init];
[aggregateDescription setName:@"count"];
[aggregateDescription setExpression:aggregateExpression];
[aggregateDescription setExpressionResultType:NSInteger32AttributeType];
[request setPropertiesToFetch:@[@"name", aggregateDescription]];