CoreData合并插入

时间:2014-06-12 18:20:16

标签: ios cocoa core-data nsmanagedobject nsmanagedobjectcontext

因此,在一个应用程序中我们有两个NSManagedObjectContext,让我们称它们为context1和context2。我们遇到一种情况,其中customId = 1的对象被插入到context2中,而context2从未保存。在将来的某个时刻,对象将添加到context1,customId也为1。然后保存context1,当收到完成通知时,乐趣就开始了!我们尝试通过以下方法将保存中的更改合并到context2中:

[context2 mergeChangesFromContextDidSaveNotification:notification];

这很好,它会进行合并,然后在context2中有两个对象,都是customId = 1。但是,我想要发生的是,在合并时,它以某种方式意识到两个对象具有相同的customId,因此它不是进行插入,而是仅更新现有对象并在内部使两者成为相同的对象(或者是那个效果:/)。我原以为这可能是通过重写isEqual和hash来实现的,但是对于NSManagedObjects来说这是严格禁止的!

另一个想法是使用validateInsert:当它试图插入新对象时告诉它不要复制值。然而,这会引起另一个问题。我们现在有一个持久存储,一个对象,context2有一个不同的对象。然后我们必须从context1中删除对象并保存该更改以从持久存储中删除对象...但是因为我们从不想保存context2(这可能看起来很奇怪,但我们有正当理由......我保证! )那个对象永远不会被保存。

我们基本上希望能够告诉CoreData在完成两次插入后,它们实际上应该是同一个对象!如果有人对我们如何能够做到这一点有任何想法,那么在这一点上的任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

这种类型的合并策略是您需要处理的,并且超出了框架的范围。基本上你有一个肮脏的沙箱和一个干净的沙箱。当在干净的沙箱中进行更改时,它将传播到脏沙箱。

脏沙箱的所有者有责任观察进入的变化并对其作出反应。您可以收听NSManagedObjectContextDidSaveNotification并检查是否发生了碰撞。从那里开始,您的业务逻辑决定了接下来会发生什么。