2014-02-13 116 views
0

我的核心数据模型:核心数据 - 中取出的对象检测等于属性

Contact 
======= 

name 
phone number (unique) 

我需要显示与下列条件触点的表视图:

,如果有一个以上的接触同样 - 显示名称+编号
否则 - 只显示名称

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

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

我的表视图应该提出:

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]; 

我在寻找最有效的方法要知道哪个名字出现不止一次,所以我可以显示名称旁边的数字。

回答

2

如果您使用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包含名称在db中多次出现的联系人的名称。因此,无论何时在表格视图中显示的联系人,只需查询duplicateNames阵列以检查实际联系人是否重复。

1

,如果你只是想修改显示我将修改tableView:cellForRowAt...检查人员的姓名上面和下面的当前

基本模拟代码

最简单方式:

- tableView:cellForRowAtIndexPath:(id)path { 
    .... 
    Person *prior = ... 
    Person *next = ... 

    if(prior.name == current.name || next.name == current.name) { 
     //show name+number 
    } 
} 
+0

感谢您的回复,但我不能使用这种方法。我没有在我的问题中提到它,但我有多个部分,这部分还显示联系人,但不是全部。所以如果用户没有滚动到我的主要部分中的此联系人,我有一个问题 – Mario

+0

我想我必须做另一次获取,我只是想知道什么是最有效的。 – Mario

+0

:D是的,你没有提到..但为此,我会告诉你最优雅的方式! –