NSFetchedResultsController 错误:“NSInternalInconsistencyException”,原因:“索引 0 部分中索引 1 处没有对象”
Posted
技术标签:
【中文标题】NSFetchedResultsController 错误:“NSInternalInconsistencyException”,原因:“索引 0 部分中索引 1 处没有对象”【英文标题】:NSFetchedResultsController Error: 'NSInternalInconsistencyException', reason: 'no object at index 1 in section at index 0' 【发布时间】:2011-07-01 08:11:29 【问题描述】:我有一个使用 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();
【问题讨论】:
你在dict中有条目吗? 【参考方案1】:在“selectedevents”下面的代码中是 一个数组,其计数等于 获取结果中的对象数 控制器。
但是
错误说'索引 1 处没有对象 在索引 0' 的部分中您获取 结果控制器可能有多个 部分。
另外,代码应该是:
NSManagedObject *evt=[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
...不是:
Event *evt=[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
【讨论】:
【参考方案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:]
返回的对象时循环两次。这可能是由于当fetchedObjects
有两个或更多元素时设置了selectedEvents
,然后删除了一个而不更新selectedEvents
的新计数。当您尝试遍历行时,您至少会走远并获得异常。
将 for 循环更改为直接在 fetchedObjects
上建立索引:
for (int i=0; i<[[fetchedResultsController fetchedObjects] count]; i++)
... 将解决眼前的问题,但如果您依赖尝试将 selectedEvents
数组与获取的结果控制器同步,您的代码将总是很脆弱。
【讨论】:
以上是关于NSFetchedResultsController 错误:“NSInternalInconsistencyException”,原因:“索引 0 部分中索引 1 处没有对象”的主要内容,如果未能解决你的问题,请参考以下文章