我和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]
(但无济于事)。
答案 0 :(得分:6)
我经历过地狱和核心数据,我学到了一些东西。我很累,所以我只想写一个快速摘要。
删除实体时,核心数据可能会因删除规则而拒绝该实体。我的删除没有通过的原因是因为它需要级联但它无效。我认为这与离开实体的方式有关。我不知道为什么这会导致阻止删除,但这就是我的情况所解决的问题。我发现它的方式是通过日志,我看到一些关于引用的依赖实体的声明,我意识到删除规则将适用。
当日志说明严重错误和监听器时,请检查FRC代码。由于这是听众,你的罪魁祸首代码将在这里。就我而言,我禁用了[tableview beginUpdates]和[tableview endupdates]。 FRC实际上需要这个(我认为它是可选的)。否则,您会收到有关不一致和managedobjectcontextlistener的错误,以及如何添加或删除行等等。
删除时,它实际上可能会保存到内存本地上下文中,但可能无法保存到持久性存储中。这意味着FRC委托代码将看到更改,但可能无法保存。此外,内存存储可能不会执行删除规则检查,因为它通过我的。但持久性商店将进行检查。我必须更多地研究这个问题。