coredata错误使tableView无法显示(NSFetchedResultsController)

Posted

技术标签:

【中文标题】coredata错误使tableView无法显示(NSFetchedResultsController)【英文标题】:coredata error Make tableView can't be showed (NSFetchResultsController) 【发布时间】:2011-10-21 05:12:37 【问题描述】:
CoreData: error: Serious application error.  An exception was caught from the delegate of 

NSFetchedResultsController during a call to -controllerDidChangeContent:.  Invalid update: invalid number of sections.  
The number of sections contained in the table view after the update (1) must be equal to the number of sections contained in the table view before the update (0), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted). with userInfo (null)

这样的错误?我怎么知道?我的代码有什么问题..我不明白那个错误..任何人都可以告诉我那是什么?我该如何解决这个问题?

段数始终为 1.. 为什么更新前从 0 开始?如何让表格在任何更新之前重新识别出只有 1 个且只有 1 个部分?

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    
        return [[self.FetchController sections] count];
    

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    
        id <NSFetchedResultsSectionInfo> sectionInfo = [[self.FetchController sections] objectAtIndex:section];
        /*int numberOfRow=[sectionInfo numberOfObjects]-(self.numberOf20SkipFromtheBeginning*20);
        numberOfRow = MIN(20,numberOfRow);*/
        //int numberOfRow=MIN(100,[sectionInfo numberOfObjects]);
        CalledRowCountingNotYetCallRowForSection=true;
        [self.tableViewA setBounces:YES];

        if([sectionInfo numberOfObjects]>100)
            //[Timer searchCriteriaChanged];
            CLog(@"Something Wrong This NumberOfRow: %d", [sectionInfo numberOfObjects]);
        


        return [sectionInfo numberOfObjects];
    

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
        DLog(@"Function TableView AT listnewController");

        CalledRowCountingNotYetCallRowForSection =false;
        if ([self tableView:tableView numberOfRowsInSection:indexPath.section]==0)
        
            DLog(@"Something is VERY WRONG. Number of Section: %d" ,indexPath.section);
        
        DLog(@"Indexpath at cellForRowAtIndexPath : %d", indexPath);
        Business * theBiz=[self.FetchController objectAtIndexPath:indexPath];
        return theBiz.CustomCell;

    

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    
        DLog(@"Function didselectrowatindexpath listnewcontroller");
        //[BNUtilitiesQuick UtilitiesQuick].currentBusiness=[[self.FetchController fetchedObjects] objectAtIndex:[indexPath row]+self.numberOf20SkipFromtheBeginning*20];
        [BNUtilitiesQuick UtilitiesQuick].currentBusiness=[[self.FetchController fetchedObjects] objectAtIndex:[indexPath row]];
        [BNUtilitiesQuick SafelyPushControllerAtNavigationController:[BNUtilitiesQuick NearbyIsiKota].mDetailBusiness atNavigationController:[BNUtilitiesQuick NearbyIsiKota].navigationController];
    

    - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
    DLog(@"controllerWillChangeContent: %@", controller);
    [self.tableViewA beginUpdates];




- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 

    DLog(@"didChangeSection: %@", controller);

    switch(type) 
        case NSFetchedResultsChangeInsert:
            [self.tableViewA insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableViewA deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    



- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath 

    DLog(@"controller:%@\ndidChangeObject:%@\natIndexPath:%@\nforChangeType:%d\nnewIndexPath:%@\n",controller, anObject, indexPath, type, newIndexPath);

    UITableView *tableView = self.tableViewA;
    DLog(@"%@", self.tableViewA);
    switch(type) 
        case NSFetchedResultsChangeInsert:
                [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationRight];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
            break;

        case NSFetchedResultsChangeUpdate:

            //[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
            //[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationRight];
            //[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationRight];
            break;
    




- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
    [self.tableViewA endUpdates];

【问题讨论】:

【参考方案1】:

这很可能是由于在 NSFetchedResultsController 不需要 sectionNameKeyPath 时提供的。

如果您提供了sectionNameKeyPath,但该键路径还没有值,则获取的结果控制器将报告该表有零个部分。如果该键路径获得一个值,则获取的结果控制器将报告该表现在有一个或多个部分。

要解决此问题,请确保在初始化获取的结果控制器时 sectionNameKeyPath 为空。您还可以硬连线numberOfSectionsInTableView: 以始终返回零或一。

【讨论】:

以上是关于coredata错误使tableView无法显示(NSFetchedResultsController)的主要内容,如果未能解决你的问题,请参考以下文章

从 TableView 中获取数据(CoreData)

NSInternalInconsistencyException:使用 tableview CoreData 的无效更新

调用多个CoreData键值进行tableview单元格显示

TableView NSFetchedResultsController CoreData:错误

Swift CoreData:无法使用带有自定义功能的 sectionNameKeyPath 对 tableView 进行分区

使用 NSSortDescriptor 按时间倒序对 CoreData 进行排序