2

У меня есть подкласс CoreDataTableViewController (подкласс кулака UITAbleViewController от людей в Стэнфорде, сделанный для привязки CoreData и TableViews). На этом классе, я хочу выполнить fecth, сортировка с помощью атрибута под названием «определение», и код, который выполняет его состоит в следующем:избежать дублирующихся результатов в Core Data fetch

- (void)setupFetchedResultsController{ 


    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:self.entity]; 

    request.propertiesToFetch=[NSArray arrayWithObject:@"definition"]; 
    request.returnsDistinctResults=YES; 

    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"%K != nil", @"definition"]; 
    NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"%K != ''", @"definition"]; 
    NSPredicate *predicate3= [NSPredicate predicateWithFormat:@"%K contains[cd] %@", @"definition", self.seachBar.text]; 

    NSArray *prepredicateArray; 

    if ([self.seachBar.text length]) { 
     prepredicateArray = [NSArray arrayWithObjects:predicate1, predicate2, predicate3,nil]; 

    }else { 
     prepredicateArray = [NSArray arrayWithObjects:predicate1, predicate2,nil]; 

    } 

    request.predicate=[NSCompoundPredicate andPredicateWithSubpredicates:prepredicateArray]; 
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"definition" ascending:YES ]]; 





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




    [self performFetch]; 


} 

Если я правильно понял, установив request.returnsDistinctResults = ДА; следует избегать получения дубликатов. Однако это не работает, и я вижу дубликаты значения этого атрибута.

Есть ли что-то, что мне там не хватает? Я был бы признателен за некоторые намеки. Заранее спасибо.

EDIT: Если кто-то, имеющие тот же вопрос здесь, после применения ответа Давида полученного fetchedResultsController просто NSDictionary с объектом только с запрашиваемым значением, которое используется только для отображения целей вполне нормально. Одна вещь, которую я сделал в cellForRowAtIndexPath для того, чтобы отобразить результаты на этикетке клеточной:

Перед:

HNMR *hnmr = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
cell.textLabel.text=hnmr.definition; 

После:

cell.textLabel.text=[[self.fetchedResultsController objectAtIndexPath:indexPath] valueForKey:@"definition"]; 

ответ

13

От documentation of returnsDistinctResults:

Это значение используется, только если значение установлено для propertiesToFetch.

От documentation of propertiesToFetch:

Это значение используется только тогда, когда resultType установлен в NSDictionaryResultType.

Из documentation of resultType:

Значение по умолчанию NSManagedObjectResultType.


Все это говорит мне, что propertiesToFetch игнорируется, потому что вы не установите resultType себя и он по умолчанию вернуть управляемые объекты вместо словарей. Поскольку propertiesToFetch игнорируется, также игнорируется returnsDistinctResults, и поэтому вы все равно получаете дубликаты.

Попробуйте установить тип результата, чтобы возвращать словари вместо управляемых объектов.

request.resultType = NSDictionaryResultType; 
+0

Спасибо, Дэвид! Я не знал об этих вариантах на выборке, и они действительно интересны. Благодаря! – Marcal

+0

Похоже, что если вы используете NSDictionaryResultType, то нет необходимости устанавливать returnDistinctResults. Я не получаю дубликатов, если returnDistinctResults не задано. – Jeff

+0

@Jeff Это странно, поскольку по умолчанию значение «НЕТ» соответствует документации. –

6

В дополнение к Дэвид Rönnqvist ответ я предлагаю полезную ссылку (с образцом) по выбору различных значений с Core Data:

core-data-how-to-do-a-select-distinct

Надежда, что помогает.

+0

Он делает, спасибо! – Marcal

+0

@Marcal Добро пожаловать! –

Смежные вопросы