我在使用 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”,部分问题得以解决。使用NSExpressionDescription
I 可以进行提取,但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]];