IOS核心数据:计算重复值

时间:2015-02-25 14:14:22

标签: ios objective-c core-data nspredicate nsfetchrequest

我的应用程序中有很多已保存的对象“轨道”:

@interface Track : NSManagedObject
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *artistName;
@end

如何使用NSFetchRequest(并且没有NSCounterSet)获取最受欢迎的artistName?

1 个答案:

答案 0 :(得分:3)

你可以通过

完成
  • artistName
  • 对结果进行分组
  • 创建NSExpression,计算这些分组结果中artistName的出现次数。

首先使用count函数创建表达式,命名为count,然后返回整数结果:

NSExpression *countExpr = [NSExpression expressionWithFormat:@"count:(artistName)"];
NSExpressionDescription *countExprDesc = [[NSExpressionDescription alloc] init];
[countExprDesc setName:@"count"];
[countExprDesc setExpression:countExpr];
[countExprDesc setExpressionResultType:NSInteger64AttributeType];

然后创建获取请求以使用它,同时通过表达式值获取和分组:

NSFetchRequest *fr = [[NSFetchRequest alloc] initWithEntityName:@"Track"];
[fr setPropertiesToFetch:@[@"artistName", countExprDesc];
[fr setPropertiesToGroupBy:@["artistName"];
[fr setResultType:NSDictionaryResultType];

执行提取时,您将获得一系列字典。每个字典都有两个键:artistName将是artistName属性的值,count将是每个艺术家名称出现的次数。

您需要自己查找该数组中的最大值,因为遗憾的是,您无法通过表达式值对提取请求进行排序。