我有一个TableView控制器类,它使用获取的结果控制器来显示从Core Data模型中获取的“患者”实体列表。该表的部分取自称为“位置”的患者属性。以下是获取请求的排序描述符:
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]严重的应用程序错误。在Core Data更改处理期间捕获到异常: * - [NSCFArray insertObject:atIndex:]:index(1)超出bounds(1)with userInfo(null) 2010-03-22 14:42:05.272患者[1126:207] * 由于未捕获的异常'NSRangeException'终止应用程序,原因:'*** - [NSCFArray insertObject:atIndex:]:index(1)超出界限(1)'
如果患者的位置已添加(如果没有添加,则位置默认为'未知'),这似乎只会发生。它似乎也与位置的排序有关。例如,如果第一个患者位置=病房14而第二个病房位于病房9,那么它会崩溃而不会失败。
我想知道这是否与我如何要求获取的结果控制器对节名称进行排序?
这个错误让我疯了,我无法理解。任何帮助将不胜感激!
答案 0 :(得分:3)
这似乎是Apple代码中的一个错误。我使用this SafeFetchedResultsController子类获得了一些成功。
答案 1 :(得分:1)
使用NSFetchedResultsController时,只要看到“在Core Data更改处理期间捕获异常”消息,就应该立即开始查看NSFetchedResultsControllerDelegate方法。我建议在控制器的开头设置一个断点:didChangeObject:atIndexPath:forChangeType:newIndexPath方法。然后逐步执行此方法并观察发生崩溃的位置。问题可能是您没有在此方法中正确管理部分插入和删除。