【发布时间】:2013-06-24 10:53:17
【问题描述】:
我在使用 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 我可以进行提取,但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]];
【问题讨论】:
-
从您的 CoreData 模型屏幕截图中,您的
playCount属性似乎不存在? -
您谈论“歌曲”和“流派”,但图像显示“歌曲”和“艺术家”。 - 请显示确切的异常消息。
-
对不起,我上传了错误的图片。在编辑后的图像中,您可以看到 Song 实体具有 playCount 属性。这是我的异常消息:“由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'对setPropertiesToFetch中的许多关系无效:(songs.@sum.playCount)'”
-
我认为你必须使用 NSExpressionDescription 作为 sum 表达式。我不确定按该表达式排序是否有效。
标签: ios objective-c core-data nsfetchrequest