macos – 核心数据iCloud同步中的关系完整性和验证

macos – 核心数据iCloud同步中的关系完整性和验证,第1张

概述考虑以下简单实体模型:实体A与实体B的一对一关系称为b.实体B具有称为a的反向关系.两种关系都不是可选的. A Bb < ----- > a 假设我们有两个设备(1)和(2)开始完全同步.每个都有一个A类对象和一个B类对象,它们彼此相关联.在设备1上,我们有对象A1和B1,在设备B上我们有相同的逻辑对象A1和B1. 现在假设在每个设备上进行了模拟更改: On device 考虑以下简单实体模型:实体A与实体B的一对一关系称为b.实体B具有称为a的反向关系.两种关系都不是可选的.

A            Bb  < ----- > a

假设我们有两个设备(1)和(2)开始完全同步.每个都有一个A类对象和一个B类对象,它们彼此相关联.在设备1上,我们有对象A1和B1,在设备B上我们有相同的逻辑对象A1和B1.

现在假设在每个设备上进行了模拟更改:

On device 1,we delete B1,insert B2,and associate A1 with B2. Then
save changes.
On device 2,insert B3,and associate A1
with B3. Then save changes.

设备1现在尝试从设备2导入事务日志.将插入B3,并且A1将与B3关联.到目前为止一直很好,但是现在B2的关系等于零. a关系是非可选的,因此会发生验证错误.

设备2上会出现类似的情况,因为有两个B对象,并且只有一个A对象要关联.因此必须始终存在验证错误,因为B对象中的一个必须具有设置为nil的关系.

更糟糕的是,任何未来的更改都会留下错误的B对象,因此验证失败.实际上,用户无法通过重置关系来自行解决问题.它永久地被打破了.

问题是,如何解决这样的验证错误?这一切都发生在触发NSPersistentStoreDIDimportUbiquitousContentChangesNotification通知之前.它不是您的应用程序主NSManagedobjectContext中的验证错误,它是在将事务日志初始导入持久性存储期间发生的验证错误.

我能想到的唯一选择可能是尝试删除自定义setter(setA :)中的无效B对象,或者在B类本身上删除KVC验证方法(valIDateA:error :),因为这些似乎确实如此.在事务日志导入期间触发.但我不确定是否允许这样的副作用,当我尝试它时,它确实会导致令人讨厌的日志消息.

任何人都知道处理这个问题的正确方法是什么?

解决方法 在Apple的开发者论坛上查看此主题:

https://devforums.apple.com/message/641930#641930

有一位Apple员工的回复.简而言之:

1)这是在当前版本的iOS(5.1)和OS X(10.7.3)下Core Data iCloud同步中的已知错误.

2)如果关系对于验证谓词是非可选的,则同步将完全停止.因此,您需要删除有关时间的验证以保持流畅.但是,这样做会使设备的数据不匹配.

3)没有正式的解决方法.一种混乱的方法是保持跟踪关系的单独属性.然后,您需要扫描通过iCloud更改的任何对象并修复关系(如果它是nil).

我也被这个错误所困扰.处理遇到麻烦的客户非常沮丧.希望很快得到Apple的解决方案……

总结

以上是内存溢出为你收集整理的macos – 核心数据iCloud同步中的关系完整性和验证全部内容,希望文章能够帮你解决macos – 核心数据iCloud同步中的关系完整性和验证所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1015211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存