【发布时间】:2015-03-25 00:39:59
【问题描述】:
我正在从我的模型中删除所有对象,除了用户与之交互的某些对象。
删除后,我从 JSON 中获取那些保存的对象并更新它们的信息,当我保存 managedContext 时,应用程序崩溃并打印“无法从乐观锁定失败中恢复”。
我一直在寻找,但我没有找到任何有关此消息含义的信息,有什么想法吗?
谢谢。
【问题讨论】:
标签: ios objective-c core-data
我正在从我的模型中删除所有对象,除了用户与之交互的某些对象。
删除后,我从 JSON 中获取那些保存的对象并更新它们的信息,当我保存 managedContext 时,应用程序崩溃并打印“无法从乐观锁定失败中恢复”。
我一直在寻找,但我没有找到任何有关此消息含义的信息,有什么想法吗?
谢谢。
【问题讨论】:
标签: ios objective-c core-data
Google 的第一个结果,来自 Apple 的文档。 (你到底在哪里“寻找”?)
问题:您看到错误消息“无法合并更改”。
原因:两个不同的托管对象上下文试图更改相同的数据。这也称为乐观锁定失败。
补救措施:在上下文中设置合并策略,或手动(以编程方式)解决故障。您可以使用committedValuesForKeys: 检索对象当前提交的值,并且可以使用refreshObject:mergeChanges: 重新对对象进行故障处理(以便在下次访问时从其持久存储中检索其数据值)。
即使错误消息不同,这听起来很像您的情况,因为您很可能有多个上下文试图修改相同的对象。
尝试将合并策略设置为NSMergeByPropertyObjectTrumpMergePolicyType。
【讨论】:
由于尝试保存违反数据库唯一性约束的模型而出现此错误。以下 sql 在一个上下文中/使用一个上下文执行多次 (1005),直到它失败并显示“CoreData:错误:致命:无法从乐观锁定失败中恢复”。留言:
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
【讨论】:
如果您尽职尽责地设置了合并策略,但仍然收到此错误,则可能是您正在测试损坏的 Core Data SQLite 存储。
我的应用有一些代码来检查不一致之处,例如对象图中的孤立对象。为了测试这段代码,我使用 sqlite 编辑器编辑了一个 Core Data SQLite 存储,添加了一个孤立对象。但是我忽略了将 Z_OPT 列中的值从其默认值 0 更改。嗯,根据 astute reverse engineer,Z_OPT 表示对象已更改的次数,从 1 开始最初添加到数据库时。因此 0 是一个非法值,Core Data 的反应是声明一个乐观锁定失败。将该值更改为 1 即可解决此问题。
【讨论】: