这是否意味着核心数据最初设计为一旦数据写入就无法更新?
不,如果是这样的话,它就没有多大用处了,不是吗?
还有什么是冲突?
在 Core Data 中,当您有多个托管对象上下文 (MOC) 访问同一个数据存储时,可能会发生冲突。这在多线程应用程序中很常见。每个 MOC 都可以独立保存更改。但是您希望跨所有线程保持一致的数据视图,因此可以通知更改已保存在一个 MOC 上并将这些更改合并到不同的上下文中。这使上下文保持同步。
但是,如果您尝试将更改合并到 MOC 中,并且它对同一数据有不同的未保存更改,该怎么办?就像,两个 MOC 在同一个实例上更改了相同的属性,并将其更改为不同的值。这是发生冲突的时候。如果您尝试合并更改,结果取决于 MOC 的合并策略。默认情况下它使用NSErrorMergePolicy
,这意味着合并失败并且您的代码需要以某种方式整理和解决冲突。有几个内置的合并策略将不同的自动解决方案应用于冲突。
四种内置的解决方案优先考虑磁盘上的更改或内存中的更改。它们在处理非冲突内存更改的方式上也有所不同。例如,NSMergeByPropertyStoreTrumpMergePolicy
更新内存中的任何冲突更改以匹配来自其他 MOC 的更改,但保留非冲突更改。NSRollbackMergePolicy
不同之处在于它完全丢弃内存中的更改,即使它们与来自其他 MOC 的新更改不冲突。如果没有任何内置方案看起来正确,您还可以创建自己的合并策略。
在这两种情况下,单纯的数据差异无论如何都不是冲突,因此不会有冲突。
肯定会有冲突。这是一个非常常见的场景。