CoreData 合并插入

Posted

技术标签:

【中文标题】CoreData 合并插入【英文标题】:CoreData merging inserts 【发布时间】:2014-06-12 18:20:16 【问题描述】:

所以,在一个应用程序中,我们有两个 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】:

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

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

【讨论】:

酷,它开始看起来像那样!感谢您的回复!

以上是关于CoreData 合并插入的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:如何在两个 NSManagedObjectContext 之间合并插入/更新/删除,同时将合并保持为可撤消的步骤?

CoreData:在保存文档之前合并两个上下文

更改 coredata 版本时合并数据

合并更改的 CoreData 和 NSFetchedResultsController

iOS:SharedCoreData 示例代码 (iCloud + CoreData) |如何合并更改

CoreData Context合并后如何获取对象