我有一个使用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();
}
答案 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:]
返回时循环两次。这可能是由于selectedEvents
在fetchedObjects
有两个或更多元素时设置的selectedEvents
,然后删除了一个而没有为新计数更新fetchedObjects
。当您尝试遍历行时,您至少会走到远处并获得异常。
直接在for (int i=0; i<[[fetchedResultsController fetchedObjects] count]; i++)
:
selectedEvents
...将解决眼前的问题,但如果你依赖于尝试将{{1}}数组与获取的结果控制器同步,那么你的代码将永远是脆弱的。