我在使用 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]
在设置和删除中(但无济于事)。
我经历了核心数据的地狱之旅,并学到了一些东西。我很累,所以我就写一个简短的总结。
当您删除实体时,核心数据可能会由于您的删除规则而拒绝它。我的删除没有成功的原因是因为它需要级联,但它是无效的。我认为这与以某种方式遗弃实体有关。我不知道为什么这会导致阻止删除,但这就是在我的情况下修复它的原因。我发现它的方式是通过日志,我看到一些关于引用的依赖实体的声明,并且我意识到删除规则将适用。
当日志显示有关严重错误和侦听器的内容时,请检查 FRC 代码。由于这是侦听器,因此您的罪魁祸首代码将位于此处的某个地方。就我而言,我禁用了 [tableview beginUpdates] 和 [tableview endupdates]。 FRC 实际上需要这个(我认为它是可选的)。否则,您会收到一些有关不一致和 ManagedObjectContextListener 以及如何添加或删除行等的错误。
当您删除时,它实际上可能会保存到内存本地上下文中,但可能不会保存到持久存储中。这意味着 FRC 委托代码将看到更改,但可能不会保存。此外,内存存储可能不会执行删除规则检查,因为它通过了我的。但持久存储将进行检查。必须进一步研究这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)