Core data fetchedResultsContext不会真正删除对象,并导致CommittedItingStyle中的断言问题

Core data fetchedResultsContext不会真正删除对象,并导致CommittedItingStyle中的断言问题,core-data,row,assertion,Core Data,Row,Assertion,我有一个奇怪的问题,需要一些帮助 我在一个核心数据项目上,还没有使用fetchedResultsController,只是使用fetchRequets和数组来填充zableviews。所以现在我决定改变并利用FRC 到目前为止一切都很简单。。。但从那时起,使用CommittedItingStyle我就遇到了问题-删除行时,我会遇到如下异常: The number of rows contained in an existing section after the update (1) must

我有一个奇怪的问题,需要一些帮助

我在一个核心数据项目上,还没有使用fetchedResultsController,只是使用fetchRequets和数组来填充zableviews。所以现在我决定改变并利用FRC

到目前为止一切都很简单。。。但从那时起,使用CommittedItingStyle我就遇到了问题-删除行时,我会遇到如下异常:

The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update.
最后我发现,这是因为我想删除的对象仍然保留在FRC中。。。我在liko中放置了一些NSLog部分,因此:

    NSLog(@"Number before deleting: %i - deleting %@",[[fetchedResultsController fetchedObjects] count], [fetchedResultsController objectAtIndexPath:indexPath]);

    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    [context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

    NSLog(@"Number before saving: %i",[[fetchedResultsController fetchedObjects] count]);

    NSError *error;
    if (![context save:&error]) {

        [NSException raise:NSGenericException format:@"Following error occured when trying to delete %@: %@", [fetchedResultsController objectAtIndexPath:indexPath], [error description]];
    }

    NSLog(@"Number after saving: %i",[[fetchedResultsController fetchedObjects] count]);

    NSArray * cellsToDelete = [NSArray arrayWithObject:indexPath];
    [tableView deleteRowsAtIndexPaths:cellsToDelete withRowAnimation:UITableViewRowAnimationFade];
结果是:

2011-05-20 14:49:35.398 Nivellator[6000:207] Number before deleting: 3
2011-05-20 14:49:35.399 Nivellator[6000:207] Number before saving: 3
2011-05-20 14:49:35.404 Nivellator[6000:207] Number after saving: 3
当然,当我告诉tableview它将获得3行但只通过两行时,它会呕吐。。。但是这里怎么了

我的旧代码是这样的,没有任何问题

-(void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([tableView isEqual:self.entityTableView] == YES) {
        if (editingStyle != UITableViewCellEditingStyleDelete) {
            return;
        }

        if ([self.entityArray count] <= indexPath.row) {
            return;
        }

        Member *thisEntity = [self.entityArray objectAtIndex:indexPath.row];
        [delegate.managedObjectContext deleteObject:thisEntity];

        NSError *savingError = nil;

        if ([delegate.managedObjectContext save:&savingError] == YES) {

            // Remove the entity from the Array and delete the corresponding table cell with animation
            //
            [self.entityArray removeObject:thisEntity];

            NSArray * cellsToDelete = [NSArray arrayWithObject:indexPath];
            [tableView deleteRowsAtIndexPaths:cellsToDelete withRowAnimation:UITableViewRowAnimationFade];
        } else {
            /* Error handling missing */
        }
    }
}
但当我在FRC中使用扇区时,我仍然会得到相同的错误。。。我找不到比这更与FRC有关的东西

有什么想法吗

  • 删除后删除FRC的缓存
  • 检查您是否正确实现了FRC的委托方法
  • 在运行FRC的委托方法之前,请确保使用
    beginUpdate
    冻结tableview

  • 非常感谢。这在一定程度上帮助了。。。但我仍然有问题…请参阅重新编辑。我不知道这是否仍处于打开状态,但您似乎因为调用
    deleteRowsAtIndexPath:
    而收到错误。当您使用fetchedResultsController时,它会管理自己(假设您使用的是委托方法)。调用
    [context save:&error]
    会通过FRC委托方法更新表视图,因此告诉表视图以后删除行会给代码带来错误数据,并抛出您看到的异议。如果你仍然有这个问题,我希望这有助于澄清
    -(void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if ([tableView isEqual:self.entityTableView] == YES) {
            if (editingStyle != UITableViewCellEditingStyleDelete) {
                return;
            }
    
            NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
            [context deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];
    
            NSError *error;
            if (![context save:&error]) {
    
                [NSException raise:NSGenericException format:@"Following error occured when trying to delete %@: %@", [fetchedResultsController objectAtIndexPath:indexPath], [error description]];
            }
    
            if ([fetchedResultsController performFetch:&error]) {
    
                [tableView beginUpdates];
    
                NSArray * cellsToDelete = [NSArray arrayWithObject:indexPath];
                [tableView deleteRowsAtIndexPaths:cellsToDelete withRowAnimation:UITableViewRowAnimationFade];
    
                [tableView endUpdates];
            } else {
    
                [NSException raise:NSGenericException format:@"Following error occured when trying to delete %@: %@", [fetchedResultsController objectAtIndexPath:indexPath], [error description]];
            }
        }
    }