我将在新模型版本中向现有应用引入唯一约束。
该模型具有实体 Person,它与实体 Pet 具有可选的一对一关系。 Person的删除规则是cascade,Pet的逆关系删除规则是nullify。还有另一个实体 Job,它与 Person 也有一对一的关系。但是那个删除规则,和逆删除规则,都是无效的。
Person 有一个“personID”属性,我已将其设为唯一。
在主队列上下文中,我有一个 Person 的实例,ID 为 xxx,没有设置 Pet。让我们称那个人为“查理”。我也创建了一个 Job,并将其设置为“iOS Dev”,并将其分配给 Charlie 的工作属性。
然后在子私有(private)队列上下文中,我插入一个新的“Charlie”,其 ID 也为 xxx(唯一约束)并创建一个 Pet 并设置它。我没有设置工作。我毫无问题地保存了子上下文。
紧接着,我尝试保存主队列上下文。但就在这之前,我检查了 Main Queue 上下文的 insertedObjects 属性,并如我所料看到了一个 ID 为 xxx 的 Person 实例。我期望的是,第二个实例将由唯一约束处理,并与前一段中的 Person 的原始实例“合并”。但是,当我实际调用 MOC 的 save: 方法时,它抛出一个异常,我检查了 NSError 对象:
Error Domain=NSCocoaErrorDomain Code=1550 "The operation couldn’t be completed. (Cocoa error 1550.)" UserInfo={Dangling reference to an invalid object.=null
关于如何避免异常的任何想法?我习惯于 Core Data 中的“悬挂引用”,这意味着关系配置错误,但我已经检查了很多次并且看起来不错,所以我不确定还有什么可以解决的。我使用 NSMergeByPropertyObjectTrumpMergePolicy 合并策略涉及所有上下文。
显然这有点难以理解,所以我在 Github 上发布了一个示例项目以防有人感兴趣:https://github.com/bpapa/core-data-unique-bug
最佳答案
我为此烧了一张代码级支持票,一位 Apple 工程师确认存在错误。作为解决方法,建议编写我自己的调用 super 的合并策略,然后手动确保在两端设置关系。
关于ios - 核心数据唯一约束 - 保存时为 "Dangling reference to an invalid object",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36649756/