ios - 核心数据唯一约束 - 保存时为 "Dangling reference to an invalid object"

标签 ios cocoa-touch core-data

我将在新模型版本中向现有应用引入唯一约束。

该模型具有实体 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/

相关文章:

ios - 如何在应用程序模型而不是 View Controller 中实现 NSManagedObjectContext?

ios - 应更新数据时 NSManagedObject 的删除/插入与更新

ios - 显示排行榜会导致应用崩溃,因为不支持 showViewController

iphone - 使用 addAttribute 修改整个 NSMutableAttributedString :

ios - 我应该如何修复 Nimble 文件中的错误?

iphone - iCloud:我可以忽略那些禁用 iCloud 的人吗?

iphone - 当我在 iPad 上运行 iPhone 应用程序时,屏幕分辨率错误。如何解决这个问题?

ios - 应该在哪里创建 NSManagedObjectContext?

ios - 迁移到 Xcode 10.2

ios - 从云代码发回数据