2

我对 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]在设置和删除中使用(但无济于事)。

4

1 回答 1

6

我经历了地狱又回来了核心数据,我学到了一些东西。我累了,所以我就写一个简短的总结。

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

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

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

于 2013-02-22T08:20:00.380 回答