У меня есть подкласс 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"];
Спасибо, Дэвид! Я не знал об этих вариантах на выборке, и они действительно интересны. Благодаря! – Marcal
Похоже, что если вы используете NSDictionaryResultType, то нет необходимости устанавливать returnDistinctResults. Я не получаю дубликатов, если returnDistinctResults не задано. – Jeff
@Jeff Это странно, поскольку по умолчанию значение «НЕТ» соответствует документации. –