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 处的核心数据严重应用程序错误的主要内容,如果未能解决你的问题,请参考以下文章