删除 MagicalRecord 中的实体不持久

Posted

技术标签:

【中文标题】删除 MagicalRecord 中的实体不持久【英文标题】:Deleting entity in MagicalRecord is not persisting 【发布时间】:2013-02-20 23:48:20 【问题描述】:

我在使用 MagicalRecord 时遇到了一个奇怪的问题。删除不会持续存在。当我删除时, NSFetchedResultsControllerDelegate 正确地看到该对象已被删除。但是,如果我关闭并重新打开应用程序,实体会重新出现。

我用来删除实体的代码是:

ActivityType *activityType = [_fetchedResultsController objectAtIndexPath:indexPath];
[activityType deleteInContext:[NSManagedObjectContext MR_defaultContext]];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

我用来设置 NSFetchedResultsController 的代码是:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"ActivityType" inManagedObjectContext:[NSManagedObjectContext defaultContext]];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"name" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:[NSManagedObjectContext defaultContext] sectionNameKeyPath:nil
                                               cacheName:@"activityTypes"];
_fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

基于其他 SO 帖子,我也尝试在设置和删除中使用[NSManagedObjectContext rootSavingContext](但无济于事)。

【问题讨论】:

保存时确保没有错误 【参考方案1】:

我历经千辛万苦,带着核心数据回来了,我学到了一些东西。我累了,所以我就写一个简短的总结。

    当您删除实体时,核心数据可能会因为您的删除规则而拒绝它。我的删除没有通过的原因是因为它需要级联但它被取消了。我认为这与以某种方式让实体被遗弃有关。我不知道为什么会阻止删除,但这就是在我的情况下修复它的原因。我发现它的方式是通过日志,我看到了一些关于引用的依赖实体的声明,我意识到删除规则将适用。

    当日志显示严重错误和侦听器时,请检查 FRC 代码。由于这是侦听器,因此您的罪魁祸首代码将在某处。就我而言,我禁用了 [tableview beginUpdates] 和 [tableview endupdates]。 FRC 实际上需要这个(我认为它是可选的)。否则,您会收到一些关于不一致和 managedobjectcontextlistener 以及需要如何添加或删除行等的错误。

    当您删除时,它实际上可能会保存到内存本地上下文中,但可能不会保存到持久存储中。这意味着 FRC 委托代码将看到更改,但可能无法保存。此外,内存存储可能不会在通过我的时进行删除规则检查。但持久存储会进行检查。得再看看这个。

【讨论】:

以上是关于删除 MagicalRecord 中的实体不持久的主要内容,如果未能解决你的问题,请参考以下文章

每次应用加载时,MagicalRecord 都会删除所有创建的对象

MagicalRecord 不保存对多关系实体

MagicalRecord 调用多个保存方法

MagicalRecord:删除后保存上下文太长

MagicalRecord - saveinBackground 不持久化数据?

MagicalRecord 获取关系 id 为 x 的一对多关系中的所有实体