NSFetchedResultsController Ошибка: «NSInternalInconsistencyException», причина: «нет объекта с индексом 1 в разделе с индексом 0» - PullRequest
3 голосов
/ 01 июля 2011

У меня есть приложение, использующее tableview и NSFetchedResultsController.Я получаю сообщение об ошибке:

Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.   Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no object at index 1 in section at index 0'

... из кода ниже.selectedevents - это массив, число которого равно количеству объектов в контроллере выбранных результатов.

NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
NSMutableArray *array=[[NSMutableArray alloc] init];
for (int i=0; i<[self.selectedEvents count]; i++) {
    CustomDictionary *dic=[selectedEvents objectAtIndex:i];
    if (dic.isSelected) {
        Event *evt=[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
        [array addObject:evt];
    }
}
for (Event *evt in array) {
    [context deleteObject:evt];
}
NSError *error;
if (![context save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Попытка основать другой массив на [NSFetchedResultController fetchedObjects] опасна, потому что выбранный контроллер результатов всегда автоматически обновляется.Ваша проблема вызвана этим циклом:

   for (int i=0; i<[self.selectedEvents count]; i++) { 
        CustomDictionary *dic=[selectedEvents objectAtIndex:i];
        if (dic.isSelected) {
            Event *evt=[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
            [array addObject:evt];
        }
    }

... повторяется дважды, когда у вас есть только один объект, возвращаемый [NSFetchedResultController objectAtIndexPath:].Вероятно, это вызвано тем, что selectedEvents устанавливается, когда fetchedObjects имеет два или более элементов, а затем один удаляется без обновления selectedEvents для нового счетчика.Когда вы пытаетесь перебрать строки, вы идете хотя бы на один шаг и получаете исключение.

Изменение цикла for для индексации непосредственно на fetchedObjects:

for (int i=0; i<[[fetchedResultsController fetchedObjects] count]; i++)

... решит непосредственную проблему, но ваш код всегда будет хрупким, если вы полагаетесь на попытку синхронизациимассив selectedEvents с контроллером полученных результатов.

2 голосов
/ 01 июля 2011

в коде ниже "selectedevents" является массив, число которых равно этому объектов в полученных результатах контроллер.

но

ошибка говорит, что «нет объекта с индексом 1 в разделе с индексом 0 'ваш выбор Контроллер результата может иметь несколько разделы.

Также код должен быть:

NSManagedObject *evt=[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];

... не:

Event *evt=[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...