NSFetchedResultsController - ошибка секции не в порядке - PullRequest
1 голос
/ 25 ноября 2011

Я устанавливаю NSFetchedResultsController с дескриптором сортировки

sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@”name” ascending:YES selector:@selector(caseInsensitiveCompare:)];

А, раздел

aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@”name” cacheName:nil];

Затем я также установил делегата секции табличного представления следующим образом:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [self.fetchedController sectionIndexTitles];
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    return [self.fetchedController sectionForSectionIndexTitle:title atIndex:index];
}

Иногда, когда я вставляю объекты, я получаю сообщение об ошибке: «Извлеченный объект в индексе X имеет неправильное имя раздела« что-то. Объекты должны быть отсортированы по имени раздела »; *

Я вставляю тысячи строк. Когда происходит ошибка, это всегда в одном и том же случае: у меня есть 10 объектов, называемых одним и тем же, но некоторые из них в верхнем регистре, а другие в нижнем регистре. Пример: nameexample, nameExample, nameEXAMPLE, nameexample, nameExample и т. Д.

Есть идеи, почему я получаю ошибку и как это исправить? Причина, по которой он у меня не учитывает регистр, заключается в том, что мои разделы основаны на первой букве, и если у меня не будет регистронезависимости, я получу раздел «а» и раздел «А».

Ответы [ 2 ]

6 голосов
/ 25 ноября 2011

Я думаю, что порядок раздела отличается от порядка сортировки, потому что, хотя я использую один и тот же атрибут, один нечувствителен к регистру, а другой - нет.

Решение: я добавил еще один атрибут в базовые данные, который содержит имя в нижнем регистре, и я использую этот атрибут в разделе и сортирую. Таким образом, мне не нужно вызывать @selector (caseInsensitiveCompare:)

1 голос
/ 26 декабря 2011

Простите, когда я говорю, что дублирование данных заставляет меня съеживаться по двум причинам:

  • Хотя устройства, на которых установлена ​​iOS, кажутся очень способными, они гораздо более ограничены в ресурсах, чем, скажем, iMac.Значение: пространство и время являются гораздо более значимыми факторами при таргетинге на планшеты и смартфоны.
  • Независимо от того, зачем вам нужно поддерживать два примерно одинаковых набора данных?

Для тех, кто заботится о космосе или имеет рефлексивные взгляды: я думаю, что болеесоответствующее решение заставляет хранимые данные в нижнем регистре до фиксации к модели данных;и систематически корректирует буквы перед отображением.Теоретически это делает поиск более простым (более быстрым) и, безусловно, требует меньше памяти.

Или, возможно, более уместно использовать заглавные буквы в любом количестве строк перед фиксацией в модели данных. Этот пост разъясняет, что вы можете использовать

managedObject.string = [stringToBeCommitted capitalizedString];
NSError *error = nil;
if(![managedObjectContext save:&error]) {
    ...
}

для этой цели.

...