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 处没有对象”的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?