删除实体的所有条目时未调用 controllerWillChangeContent
Posted
技术标签:
【中文标题】删除实体的所有条目时未调用 controllerWillChangeContent【英文标题】:controllerWillChangeContent not being called when deleting all entries of an entity 【发布时间】:2015-03-08 03:55:44 【问题描述】:以下是我为 tableView“重置”按钮实现的方法。我已经验证实体中的条目正在被删除,但是在删除后我的 controllerWillChangeContent 没有被调用。有没有办法手动调用这个方法?
CoreDataStack *coreDataStack = [[CoreDataStack alloc]init];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"FoodEntry"];
[fetchRequest setIncludesPropertyValues:NO];
NSError *error;
NSArray *fetchedObjects = [coreDataStack.managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *object in fetchedObjects)
[coreDataStack.managedObjectContext deleteObject:object];
error = nil;
[coreDataStack.managedObjectContext save:&error];
编辑:FRC 代码
- (NSFetchedResultsController *)fetchedResultsController
if (_fetchedResultsController != nil)
return _fetchedResultsController;
CoreDataStack *coreDataStack = [CoreDataStack defaultStack];
NSFetchRequest *fetchRequest = [self entryListFetchRequest];
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:coreDataStack.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
【问题讨论】:
我怀疑您的删除代码使用的 managedObjectContext 与您获取的结果控制器不同。请您出示 FRC 的代码。 另外,这段代码什么时候运行,表视图使用什么获取请求 你是对的,它与我的 FRC 没有链接只是不知道如何解决这个问题,对编码来说还是新手。当用户按下“重置”按钮时调用它。整体被删除,我只需要表格视图在按下时适当更新。以上是我在“编辑”下的 FRC 代码。谢谢 【参考方案1】:无法确定,不知道 CoreDataStack
的内部结构,但看起来您正在使用两个不同的堆栈:请注意您的代码使用:
CoreDataStack *coreDataStack = [[CoreDataStack alloc] init];
而 FRC 使用:
CoreDataStack *coreDataStack = [CoreDataStack defaultStack];
您可以更改您的代码以使用与 FRC 相同的代码(defaultStack
可能是一个单例,并且无论何时调用它都会返回相同的堆栈)。但是如果 FRC 与删除代码在同一个类中,那么只使用 FRC 的 managedObjectContext 会更容易(也更清晰):
NSManagedObjectContext *context = self.fetchedResultsController.managedObjectContext
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"FoodEntry"];
[fetchRequest setIncludesPropertyValues:NO];
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *object in fetchedObjects)
[context deleteObject:object];
error = nil;
[context save:&error];
顺便说一下,检查executeFetchRequest:
和save:
是否返回错误总是值得的。
【讨论】:
啊!是的,没错,我在自己的类文件中将我的 coreDataStack 设置为单例。将其更改为 [coreDataStack defaultStack] 修复了它。非常感谢!以上是关于删除实体的所有条目时未调用 controllerWillChangeContent的主要内容,如果未能解决你的问题,请参考以下文章
实体框架 6 和 SQLite - 无法创建条目 PK 之前删除的条目
删除项目后使用 nil indexPath 调用 tableView:cellForRowAtIndexPath