controllerDidChangeContent 处的核心数据严重应用程序错误
Posted
技术标签:
【中文标题】controllerDidChangeContent 处的核心数据严重应用程序错误【英文标题】:Core Data Serious Application Error at controllerDidChangeContent 【发布时间】:2014-07-06 22:53:39 【问题描述】:您好,我现在遇到以下错误。
CoreData:错误:严重的应用程序错误。 在调用 -controllerDidChangeContent: 期间,从 NSFetchedResultsController 的委托中捕获了异常。 无效更新:部分数量无效。 更新后表视图中包含的节数(7)必须等于更新前表视图中包含的节数(6), 加上或减去插入或删除的节数(0 插入,0 删除)。与 userInfo (null)
我的应用程序有多个部分 tableView。 只有当我尝试插入新的节记录时才会发生错误。 如果该部分已存在,则不会发生错误。
相关代码如下。
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
[self.tableView beginUpdates];
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
UITableView *tableView = self.tableView;
DLog(@"newIndexPath %@",newIndexPath);
switch(type)
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:@[newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
break;
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
/*NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error])
DLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
[self.tableView reloadData];*/
[self.tableView endUpdates];
我还将 sectionNameKeyPath 放在 fetchResultsController 中。 真实核心数据中不存在年份列,是扩展列。
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"year" cacheName:@"Master"];
【问题讨论】:
【参考方案1】:我可以通过以下更改解决该错误。 仅针对处于相同情况的人。
我把下面这行注释掉了。
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
[self.tableView beginUpdates];
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
UITableView *tableView = self.tableView;
DLog(@"newIndexPath %@",newIndexPath);
switch(type)
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:@[newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
break;
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
[self.tableView endUpdates];
我添加了以下行。
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
// In the simplest, most efficient, case, reload the table view.
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error])
DLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
[self.tableView reloadData];
【讨论】:
以上是关于controllerDidChangeContent 处的核心数据严重应用程序错误的主要内容,如果未能解决你的问题,请参考以下文章