无法从乐观锁定故障中恢复

时间:2015-01-26 15:10:25

标签: ios objective-c core-data

我正在从我的模型中删除所有对象,除了用户已与之交互的某些对象。

删除后,我从JSON中获取这些已保存的对象并更新其信息,当我保存managedContext时,应用程序崩溃打印“无法从乐观锁定失败中恢复”。

我一直在寻找,但我没有找到任何有关此消息含义的信息,任何想法?

感谢。

3 个答案:

答案 0 :(得分:2)

谷歌的第一个结果,来自Apple的文档。 (你到底在哪里“看”?)

  

问题:您看到错误消息“无法合并更改”。

     

原因:两个不同的托管对象上下文尝试更改相同的数据。这也称为乐观锁定失败

     

补救措施:在上下文中设置合并策略,或手动(以编程方式)解决故障。您可以使用committedValuesForKeys:检索对象的当前已提交值,并且可以使用refreshObject:mergeChanges:。

重新确定对象的错误(以便在下次访问时从其持久性存储中检索其数据值)。

即使错误信息不同,这听起来与您的情况非常相似,因为您很可能有多个上下文尝试修改相同的对象。
尝试将合并策略设置为NSMergeByPropertyObjectTrumpMergePolicyType

答案 1 :(得分:0)

由于尝试保存违反数据库唯一性约束的模型,因此出现此错误。以下sql在/中使用一个上下文执行多次(1005),直到它因“CoreData:error:fatal:无法从乐观锁定失败中恢复”而失败。消息:

2016-08-10 23:20:50.613 DtLoad[49506:78762894] CoreData: sql: INSERT INTO ZSAMPLE(Z_PK, Z_ENT, Z_OPT, ZR, ZUSER, ZW) VALUES(?, ?, ?, ?, ?, ?)
2016-08-10 23:20:50.613 DtLoad[49506:78762894] CoreData: sql: ROLLBACK
2016-08-10 23:20:50.613 DtLoad[49506:78762894] CoreData: sql: BEGIN EXCLUSIVE

XCode版本7.3.1

答案 2 :(得分:0)

如果您尽职尽责地设置了合并策略后仍然出现此错误,则可能是您正在测试损坏的 Core Data SQLite 存储

我的应用程序有一些代码来检查不一致,例如对象图中的孤立对象。为了测试这段代码,我使用 sqlite 编辑器编辑了一个 Core Data SQLite 存储,添加了一个孤立对象。但是我忽略了将 Z_OPT 列中的值从其默认值 0 更改。好吧,根据 astute reverse engineer,Z_OPT 表示对象已更改的次数,从 1 开始 最初添加到数据库时。因此,0 是一个非法值,Core Data 通过声明乐观锁定失败来做出反应。将该值更改为 1 即可修复它。

相关问题