8

NSMergeByPropertyObjectTrumpMergePolicy并且NSOverwriteMergePolicy在一件事上是相同的。该属性会覆盖商店中的属性。

那么它们之间有什么不同呢?在我能想到的所有情况下,无论持久存储中的那个是否已更改,该属性都会覆盖持久存储。

还有什么是冲突?

我认为冲突只是意味着数据不同。这是否意味着核心数据最初设计为一旦数据写入就无法更新?

NSOverwriteMergePolicy如果冲突与单纯的“数据不同”不同,那么和之间有什么区别NSErrorMergePolicy

在这两种情况下,单纯的数据差异无论如何都不是冲突,因此不会有冲突。

4

1 回答 1

12

这是否意味着核心数据最初设计为一旦数据写入就无法更新?

不,如果是这样的话,它就没有多大用处了,不是吗?

还有什么是冲突?

在 Core Data 中,当您有多个托管对象上下文 (MOC) 访问同一个数据存储时,可能会发生冲突。这在多线程应用程序中很常见。每个 MOC 都可以独立保存更改。但是您希望跨所有线程保持一致的数据视图,因此可以通知更改已保存在一个 MOC 上并将这些更改合并到不同的上下文中。这使上下文保持同步。

但是,如果您尝试将更改合并到 MOC 中,并且它对同一数据有不同的未保存更改,该怎么办?就像,两个 MOC 在同一个实例上更改了相同的属性,并将其更改为不同的值。这是发生冲突的时候。如果您尝试合并更改,结果取决于 MOC 的合并策略。默认情况下它使用NSErrorMergePolicy,这意味着合并失败并且您的代码需要以某种方式整理和解决冲突。有几个内置的合并策略将不同的自动解决方案应用于冲突。

四种内置的解决方案优先考虑磁盘上的更改或内存中的更改。它们在处理非冲突内存更改的方式上也有所不同。例如,NSMergeByPropertyStoreTrumpMergePolicy更新内存中的任何冲突更改以匹配来自其他 MOC 的更改,但保留非冲突更改。NSRollbackMergePolicy不同之处在于它完全丢弃内存中的更改,即使它们与来自其他 MOC 的新更改不冲突。如果没有任何内置方案看起来正确,您还可以创建自己的合并策略。

在这两种情况下,单纯的数据差异无论如何都不是冲突,因此不会有冲突。

肯定会有冲突。这是一个非常常见的场景。

于 2013-01-25T17:35:44.153 回答