【问题标题】:NSFetchedResultsController Error: 'NSInternalInconsistencyException', reason: 'no object at index 1 in section at index 0'NSFetchedResultsController 错误:“NSInternalInconsistencyException”,原因:“索引 0 部分中索引 1 处没有对象”
【发布时间】: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中有条目吗?

标签: iphone ios core-data nsfetchedresultscontroller nsmanagedobjectcontext


【解决方案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 数组与获取的结果控制器同步,您的代码将总是很脆弱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多