0

我有一个 TableView 控制器类,它使用获取的结果控制器来显示从核心数据模型中获取的“患者”实体列表。该表的部分取自称为“位置”的患者属性。这是获取请求的排序描述符:

NSSortDescriptor *locationDescriptor = [[NSSortDescriptor alloc] initWithKey:@"location" ascending:YES];
NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:locationDescriptor, lastNameDescriptor, nil];

这是 FRC 的初始化代码:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"location" cacheName:@"List"];

当我想添加一个新的“患者”实体时 - 我单击一个添加按钮,然后将一个“添加新患者”视图控制器推送到导航堆栈。

我添加的第一个病人工作正常。

如果我添加第二个患者 - 应用程序有时会崩溃并出现以下错误:

2010-03-22 14:42:05.270 患者 [1126:207] 严重的应用程序错误。在核心数据更改处理期间捕获到异常:* -[NSCFArray insertObject:atIndex:]:索引 (1) 越界 (1) 与 userInfo (null) 2010-03-22 14:42:05.272 患者 [1126:207] *由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[NSCFArray insertObject:atIndex:]: index (1) beyond bounds (1)”

这似乎只有在患者添加了位置时才会发生(如果没有添加,则位置默认为“未知”)。它似乎也与位置的排序有关。例如,如果第一个患者位置 = 14 号病房,第二个患者位置 = 9 号病房,那么它一定会崩溃。

我想知道这是否与我如何要求获取的结果控制器对部分名称进行排序有关?

这个错误让我发疯,我就是想不通。任何帮助将不胜感激!

4

2 回答 2

3

这似乎是苹果代码中的一个错误。我使用这个SafeFetchedResultsController 子类取得了一些成功。

于 2010-05-19T05:54:56.283 回答
1

任何时候你在使用 NSFetchedResultsController 时看到消息“异常在核心数据更改处理期间被捕获”,你应该立即开始查看你的 NSFetchedResultsControllerDelegate 方法。我建议在控制器的开头设置断点:didChangeObject:atIndexPath:forChangeType:newIndexPath 方法。然后逐步执行此方法并观察崩溃发生的位置。问题可能是您没有在此方法中正确管理您的部分插入和删除。

于 2010-03-27T09:18:11.427 回答