ios - 核心数据 - 检测获取对象中的相等属性

标签 ios iphone objective-c core-data nsfetchedresultscontroller

我的核心数据模型:

Contact
=======

name
phone number (unique)

我需要显示具有以下条件的联系人 TableView :

如果有多个联系人具有相同的姓名 - 显示姓名+号码
否则 - 仅显示名称

例如,如果我的核心数据联系人是:

Michael, 11112221  
Jon, 33438282  
Jon, 72727272  
Lisa, 99939393  

我的 TableView 应该显示:

Jon (33438282)  
Jon (72727272) 
Lisa   
Michael  

目前我正在使用以下 NSFetchRequest 来显示联系人列表:

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Contact"];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)]];
request.fetchBatchSize = 20;

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                    managedObjectContext:context
                                                                      sectionNameKeyPath:@"nameFirstLetter"
                                                                               cacheName:nil];  

我正在寻找最有效的方法来了解哪个名字出现了不止一次,这样我就可以在名字旁边显示数字。

最佳答案

如果您使用 NSSQLiteStoreType 作为持久存储,您可以使用 NSExpression 获取重复项:

NSEntityDescription *entity        = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:self.managedObjectContext];
NSAttributeDescription *nameDesc   = [entity.attributesByName objectForKey:@"name"];
NSExpression *keyPathExpression    = [NSExpression expressionForKeyPath:@"name"];
NSExpression *countExpression      = [NSExpression expressionForFunction:@"count:" arguments:@[keyPathExpression]];

NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName: @"count"];
[expressionDescription setExpression: countExpression];
[expressionDescription setExpressionResultType: NSInteger32AttributeType];

NSError *error = nil;
NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Contact"];
[fetch setPropertiesToFetch:@[nameDesc, expressionDescription]];
[fetch setPropertiesToGroupBy:@[nameDesc]];
[fetch setResultType:NSDictionaryResultType];

NSArray *results = [self.managedObjectContext executeFetchRequest:fetch error:&error];
NSArray *duplicates = [results filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"count > 1"]]; 
NSArray *duplicateNames = [duplicates valueForKeyPath:@"name"];

duplicateNames 包含在数据库中多次出现的联系人姓名。因此,每当 TableView 中显示联系人时,只需查询 duplicateNames 数组以检查实际联系人是否重复。

关于ios - 核心数据 - 检测获取对象中的相等属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21749089/

相关文章:

ios - 设置自定义 UITextField

iphone - 为iphone设计网站

ios - 如何使用 react native 和 react-native-fetch-blob 在 iOS 上下载和检索本地文件?

objective-c - 如何获取 NSStatusItem 的屏幕位置

objective-c - .m 文件的引用在哪里?

ios - 我的应用程序中仅显示一张表情符号图像

ios - 手动将 nil 设置为 swift 对象以避免保留循环?

iphone - 直接设置原点和大小的 UIView 类别

iphone - GestureRecogniser 并禁用 UIScrollView 中 UIView 的拖动手势

Java 相当于 Objective C 方法作用域静态变量