IOS核心数据:计算重复值

Posted

技术标签:

【中文标题】IOS核心数据:计算重复值【英文标题】:IOS Core Data : Count Duplicated values 【发布时间】:2015-02-25 14:14:22 【问题描述】:

我的应用中有很多保存的对象“曲目”:

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

如何使用 NSFetchRequest(并且不使用 NSCounterSet)获得最受欢迎的艺术家姓名?

【问题讨论】:

适用于 ios 还是 OSX? 【参考方案1】:

你这样做

将结果按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];

当您执行 fetch 时,您会得到一个字典数组。每个字典都有两个键:artistName 将是您的 artistName 属性的值,count 将是每个艺术家姓名出现的次数。

您需要自己找到该数组中的最大值,因为不幸的是,您无法告诉 fetch 请求按表达式值对结果进行排序。

【讨论】:

以上是关于IOS核心数据:计算重复值的主要内容,如果未能解决你的问题,请参考以下文章

iOS9 Xcode 7 - 核心数据 - 避免重复对象

在 iOS 中正确访问 ViewController 中的核心数据上下文 [重复]

登录时多个用户访问的核心数据值(iOS Swift)

iOS:检查值是不是与核心数据中实体的任何属性匹配?

Kettle入门系列之四 (核心对象:转换)

登录时由多个用户访问的核心数据值(iOS Swift)