Core data fetchedResultsContext不会真正删除对象,并导致CommittedItingStyle中的断言问题
我有一个奇怪的问题,需要一些帮助 我在一个核心数据项目上,还没有使用fetchedResultsController,只是使用fetchRequets和数组来填充zableviews。所以现在我决定改变并利用FRC 到目前为止一切都很简单。。。但从那时起,使用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
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有关的东西
有什么想法吗
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]];
}
}
}