删除实体的所有条目时未调用 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

调用 Selector 方法时未从 Superview 中删除视图

使用删除与隐藏时未调用自定义动画

如何查看所有 ArrayList 条目并删除特定条目?

核心数据删除所有对象有没有更快的方法