核心数据唯一约束 - 保存时"悬挂对无效对象的引用"

bpa*_*apa 6 cocoa-touch core-data ios

我在一个新的模型版本中向现有应用程序引入了Unique Constraints.

该模型具有实体Person,其与实体Pet具有可选的一对一关系.Person的删除规则是级联的,Pet的反向关系删除规则是无效的.还有另一个实体,Job,Person也有一对一的关系.但是,删除规则和反向删除规则都是无效的.

人有一个"personID"属性,这是我独特的.

在主队列上下文中,我有一个Person的实例,ID为xxx,没有Pet set.我们称那个人为"查理".我也创建了一个Job,并将其设置为"iOS Dev",并将其分配给Charlie的工作属性.

然后在子私有队列上下文中,我插入一个新的"Charlie"也带有ID xxx(唯一约束)并创建一个Pet并设置它.我没有设置工作.我保存了子上下文没有问题.

紧接着,我尝试保存主队列上下文.但就在此之前,我检查主队列上下文的insertedObjects属性,并按照我的预期看到ID为xxx的Person实例.我期待的是,这个第二个实例将由唯一约束处理,并与前一段中的Person的原始实例"合并".但是,当我实际调用MOC的save:方法时,它抛出异常并检查NSError对象:

错误域= NSCocoaErrorDomain代码= 1550"操作无法完成.(Cocoa错误1550.)"UserInfo = {悬挂对无效对象的引用.= null

关于如何避免异常的任何想法?我习惯于核心数据中的"悬空引用",这意味着关系配置错误,但我已经多次查看它看起来很好,所以我不确定还有什么可以排除故障.我使用NSMergeByPropertyObjectTrumpMergePolicy合并策略涉及所有上下文.

显然这有点难以理解,所以我在Github上提出了一个示例项目以防任何人感兴趣:https://github.com/bpapa/core-data-unique-bug

bpa*_*apa 4

我最终为此烧掉了一张代码级支持票,一位苹果工程师确认存在一个错误。作为解决方法,建议编写我自己的合并策略,该策略调用 super,然后手动确保在两端设置关系。