NSFetchedResultsController错误:'NSInternalInconsistencyException',原因:'索引1处的索引1处没有对象'

时间:2011-07-01 08:11:30

标签: iphone ios core-data nsfetchedresultscontroller nsmanagedobjectcontext

我有一个使用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 个答案:

答案 0 :(得分:2)

  

在下面的代码中“selectedevents”是   计数等于的数组   获取结果中的对象   控制器。

但是

  

错误说'索引1处没有对象   在索引0'的部分你的提取   结果控制器可能有多个   部分。

此外,代码应为:

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

......不是:

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

答案 1 :(得分:2)

尝试在[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:]返回时循环两次。这可能是由于selectedEventsfetchedObjects有两个或更多元素时设置的selectedEvents,然后删除了一个而没有为新计数更新fetchedObjects。当您尝试遍历行时,您至少会走到远处并获得异常。

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

上将for循环更改为索引
selectedEvents

...将解决眼前的问题,但如果你依赖于尝试将{{1}}数组与获取的结果控制器同步,那么你的代码将永远是脆弱的。