Серьезная ошибка приложения в основных данных с fetchedResultsContainer - PullRequest
18 голосов
/ 14 октября 2010

При попытке добавить запись появляется следующая ошибка:

Серьезная ошибка приложения.Исключение было обнаружено во время обработки изменений Core Data.Обычно это ошибка в наблюдателе NSManagedObjectContextObjectsDidChangeNotification.Индекс 0 недопустим с userInfo (null)

И все.Я поместил точки останова во все реализованные мной методы делегата fetchedResultsContainer, но ничего не сломалось.

Я отследил их до:

  NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"titleFirstLetter" cacheName:@"Root"];

"sectionNameKeyPath" - это проблема.titleFirstLetter - это временное свойство, для которого я создал метод получения в своем подклассе NSManagedObject.

Вот метод получения:

-(NSString *)titleFirstLetter
{
  [self willAccessValueForKey:@"titleFirstLetter"];
  NSString *aString = [[self valueForKey:@"title"] uppercaseString];

  NSString *stringToReturn = [aString substringWithRange:[aString rangeOfComposedCharacterSequenceAtIndex:0]];

  [self didAccessValueForKey:@"titleFirstLetter"];
  return stringToReturn;
}

Когда я изменяю sectionNameKeyPath на nil, это работает, но, очевидно, не то, что я хочу.Это также работает, когда у меня уже есть название для моей модели, так что titleFirstLetter не возвращает nil, хотя это, похоже, не является проблемой.Если я сделаю строку произвольной, если она равна nil, она все равно падает.

Есть идеи, что здесь происходит?

ОБНОВЛЕНИЕ: Если я использую заголовок в sectionNameKeyPath вместо свойства transient, онне вылетает, но, очевидно, помещает каждый элемент в свой раздел.Так что это как-то связано с переходным свойством ...

ОБНОВЛЕНИЕ2: Некоторые предварительные взломы с использованием постоянного свойства вместо переходного, и никаких других изменений, кажется, работают просто отлично, так что это выглядит как ошибка.У меня открыт отчет об ошибке: # 8553064

ОБНОВЛЕНИЕ3: Ну, поцарапайте это.Использование постоянного атрибута не имеет никакого значения.Теперь я немного в конце.

Спасибо!

Ответы [ 5 ]

12 голосов
/ 16 октября 2010

Ну, это, вероятно, частично (или полностью) ошибка пользователя. Проблема заключалась в том, что в представлении, в котором я добавляю новый элемент, я поместил [self.tableView reloadData] в метод viewWillAppear. Комментируя это, мы не обновили ячейки таблицы, но предотвратили сбой.

Затем я отправил reloadRowsAtIndexPaths:withRowAnimation: в табличное представление, чтобы вручную перезагрузить несколько ячеек, которые в нем нуждались.

Я рад, что это наконец закончилось!

2 голосов
/ 13 апреля 2013

Я думал, что это моя проблема.Я получил то же предупреждение, но мое решение было ОЧЕНЬ другим.

Вы можете получить эту ошибку, если вы не правильно реализовали все методы делегата NSFetchedResultsController.Я всегда просто копирую и вставляю 4 метода от Apple, чтобы узнать, как реализовать NSFetchedResultsController.

К сожалению, я пропустил один из них:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];
}

УБЕДИТЕСЬ, ЧТО ВЫ ПОЛУЧИЛИ ЭМ, иначе вывыдерну твои волосы как я.

2 голосов
/ 16 октября 2010

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

Если вы хотите настроить поведение имени раздела, подкласс NSFetchedResultsController и переопределите sectionIndexTitleForSectionName: и sectionIndexTitles. Подробности смотрите в NSFetchedResultsController документах.

1 голос
/ 06 января 2012

Я нашел другой способ прийти к тому же загадочному исключению. Мое временное свойство - как и ваше - извлекать первую букву - не защищалось от строки длиной 0 (@ ""). Попытка получить его первый символ вызвала исключение и привела к ошибке Core Data (а не к тому исключению, которое вы ожидаете увидеть).

0 голосов
/ 14 октября 2015

Важно

NSFetchedResultsController * consultMessageFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[[[WYCoreDataStorage shareStore] coreDataHelper] mainContext] sectionNameKeyPath:nil cacheName:nil];

Если вы используете кэш, вы должны вызвать deleteCacheWithName: перед изменением любого запроса на выборку, его предиката или дескрипторов его сортировки.Вы не должны повторно использовать один и тот же контроллер полученных результатов для нескольких запросов, если только для параметра cacheName не установлено значение nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...