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是的,你沒有提到..但爲此,我會告訴你最優雅的方式! –