我有一个 Reminder 实体,每当某个实体 B 被删除时,它需要更新其 date 属性。我花了几天时间编写代码,认为我可以在删除时在我的托管对象子类中做一些有用的事情。我试过了
- (void)willSave
{
if (self.isDeleted)
// use self.managedObjectContext
}
上下文为零。那里的关系也破裂了。很公平。
所以...我开始为 prepareForDeletion 编写繁琐的代码以规避对象尚未删除的事实,但随后 Core Data 将 self.managedObjectContext == nil 扔到我面前。文档说这是我“在关系被破坏之前”做事的地方。那么,如果 self.relationshipA.managedObjectContext 是可访问的(如文档所建议的),那么 self.managedObjectContext == nil 有什么意义呢?更重要的是,为什么我尚未删除的对象没有它的上下文?
我读了一条评论 here关于那个问题
its not 'fault' as much as it is a 'disown', the context has disowned your object (he was deleted and save was committed to the database) and so your object was disowned. don't save in methods that are changing and object as the save should probably be committed/saved after the operation anyway. – Dan Shelly May 21 at 19:05
我的代码是:
[moc deleteObject:obj]
[moc save:NULL]
当我删除保存操作时,我的 self.managedObjectContext 存在于 prepareForDeletion 中。也就是说,直到自动保存,当它再次为零时。可能是因为父上下文也删除了它,然后由 UIManagedDocument 保存。
我开始认为我唯一的选择是制作一个自定义删除方法(在 Core Data 级联删除之前有效,在这种情况下它不会被调用),或者制作一个监听 NSManagedObjectContextDidSaveNotification 的新类.
更新:
用户想和一个人保持联系,如果没有联系,希望在一定的时间间隔(存储在ContactWish中)得到提醒。我想要完成的是,当某个人的最新 ContactOccasion 被删除时,相应的 occasion->person->wish->reminder 得到更新(使用间隔)。
因为这对我来说是一次学习经历,所以我想找到正确的方法(一种与级联删除等一起使用的方法),而不是仅仅从我代码中我执行 [ 的每个地方手动调用更新MOContext deleteObject:occasion]。欢迎提出建议。
(提醒实体也准备了更多手动使用)
最佳答案
让 Reminder 实体管理它的日期属性不是更合乎逻辑吗?它可以“监听”(可能通过 changedValues:)它的关系实体被删除并执行更新。
这看起来更一致,因为 B 实体不应该真正关心 Reminder 实体更新的逻辑。
编辑
根据下面的讨论并基于我的观点,您不能使用更新逻辑过多地加载数据库级联删除模型:
您可以引入一个您设置和监听的属性来执行更改,而不是对删除使用react。
我真的看不出依赖核心数据删除机制比仅仅编写自己的处理此逻辑的“deleteOccasion”方法更容易或更优雅。
关于ios - NSManagedObject prepareForDeletion 中的 self.managedObjectContext == nil 有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18038018/