2

date我有一个提醒实体,每当删除某个实体 B 时,它都需要更新其属性。我花了几天时间编写代码,认为我可以在删除时在托管对象子类中做一些有用的事情。我试过了

- (void)willSave
{
if (self.isDeleted) 
    // use self.managedObjectContext
}

上下文为零。那里的关系也破裂了。很公平。

所以...我开始编写繁琐的代码prepareForDeletion来规避对象尚未被删除的事实,但随后 Core Data 将 self.managedObjectContext == nil 扔到了我的脸上。文档说这是我“在关系破裂之前”做事的地方。那么self.managedObjectContext == nilifself.relationshipA.managedObjectContext是可访问的(正如文档所建议的那样)有什么意义呢?更重要的是,为什么我尚未删除的对象没有它的上下文?

在这里阅读了有关该问题的评论

它不是“错误”,而是“拒绝”,上下文已经拒绝了您的对象(他被删除并且保存已提交到数据库),因此您的对象被拒绝了。不要保存在正在更改的方法和对象中,因为无论如何应该在操作之后提交/保存保存。– 丹·雪莉 5 月 21 日 19:05

我的代码是:

[moc deleteObject:obj]
[moc save:NULL]

当我删除保存操作时,我self.managedObjectContext存在于prepareForDeletion. 也就是说,直到自动保存,当它再次为零时。可能是因为父上下文也删除了它,然后由 UIManagedDocument 保存。

我开始认为我唯一的选择是创建一个自定义删除方法(直到 Core Data 级联删除,在这种情况下它不会被调用),或者创建一个监听 NSManagedObjectContextDidSaveNotification 的新类。

更新:

我的核心数据模型

用户想要与一个人保持联系,并且想要在一定时间间隔后(存储在 ContactWish 中)在没有联系时得到提醒。我想要完成的是,当某个人的最新 ContactOccasion 被删除时,相应的场合->person->wish->reminder 会更新(使用间隔)。

由于这对我来说是一种学习体验,我想找到正确的方法(一种适用于级联删除等的方法),而不仅仅是从我的代码中的每个地方手动调用更新[MOContext deleteObject:occasion]。欢迎提出建议。

(提醒实体也准备了更多手动使用)

4

1 回答 1

1

Reminder让实体管理其日期属性不是更合乎逻辑吗?它可以“监听”(可能通过changedValues:)其关系实体被删除并执行更新。

这似乎更一致,因为B实体不应该真正关心Reminder实体更新的逻辑。

编辑
根据下面的讨论并基于我的观点,您不能使用更新逻辑过多地加载数据库级联删除模型:

您可以引入一个您设置和侦听的属性来进行更改,而不是对删除做出反应。

我真的不明白依靠核心数据删除机制比编写自己的“deleteOccasion”方法来处理这个逻辑更容易或更优雅。

于 2013-08-04T07:24:44.810 回答