为啥向核心数据实体添加双重属性会导致远距离相关实体中的属性冲突出现 NSInternalInconsistencyException?

Posted

技术标签:

【中文标题】为啥向核心数据实体添加双重属性会导致远距离相关实体中的属性冲突出现 NSInternalInconsistencyException?【英文标题】:Why Does Adding a Double Attribute to a CoreData Entity Cause NSInternalInconsistencyExceptions for Property Conflicts in Distantly Related Entities?为什么向核心数据实体添加双重属性会导致远距离相关实体中的属性冲突出现 NSInternalInconsistencyException? 【发布时间】:2020-03-04 19:23:43 【问题描述】:

我们最近决定向我们的Product CoreData 实体添加一些可选的双类型属性(名为last7last30last60),但这会导致NSInternalInconsistencyException

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“实体“评论”中名为“sortKey”的属性与从父实体“ChatItem”继承的属性冲突”

CommentChatItem的子类,sortKeyChatItem中声明的String属性,由Comment继承。 CommentsortKey 属性上有一个获取索引;删除它并不能解决问题。

正如您在此连接器视图屏幕截图中所见,Products 通过Event 实体与这两个类有切线相关;每个Product 有多个Events,每个Event 有多个ChatItems。实际上,这些ChatItems 中的大多数都是Comment 的子类。

将新属性标记为“瞬态”可解决崩溃问题,但不会将数据存储在 CoreData 中,这是对这些值的要求。

我们注意到在全新安装时不会出现此问题,因此我们假设它在某种程度上与迁移有关。根据对这个非常相似的 *** 问题 (Preventing a CoreData crash for upgrading users) 的公认答案,我们验证我们已启用轻量级迁移:

let options = [
  NSMigratePersistentStoresAutomaticallyOption: true,
  NSInferMappingModelAutomaticallyOption: true,
  NSSQLiteAnalyzeOption: true,
  NSSQLiteManualVacuumOption: true
]
store.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: self.storeURL, options: options)

我们很困惑,因为表面上导致问题的属性不是我们正在更改的实体的一部分;我们缺少什么?

【问题讨论】:

实体ChatItem中是否有一个名为sortKey的属性? @andrewbuilder 是的,在ChatItem中定义,由Comment继承 抱歉,Alex,我的意思是问...您的模型是否在实体 Comment 中包含另一个同名属性 sortKey @andrewbuilder 没有,只​​有ChatItem 明确定义了sortKey @Natali 我给 Apple 留下了一个错误报告,从那以后得到了回复——他们提出的解决方案是多个步骤(我还没有尝试过),这似乎是 CoreData 本身的一个错误;长话短说 - 在未来的项目中避免核心数据继承。 【参考方案1】:

我遇到了同样的问题,只是在 ios 14 上,而不是在 iOS 15 上。

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“实体“中名为“myproperty”的属性与从父实体继承的属性冲突” ''

我能够通过删除用于迁移的源模型版本上的索引来解决问题。

注意:索引不是直接引用有问题的键“myproperty”,而是重命名为“myproperty”的键上的索引。这显然看起来像是 iOS 14 的错误。

【讨论】:

我遇到了同样的问题,还从当前模型版本中删除了索引,这似乎在模拟器中工作。但是我仍然看到很多这样的崩溃发生。你能详细说明一下你的具体步骤是什么吗?有点舍不得改以前的机型版本,好像不太对……

以上是关于为啥向核心数据实体添加双重属性会导致远距离相关实体中的属性冲突出现 NSInternalInconsistencyException?的主要内容,如果未能解决你的问题,请参考以下文章

向实体添加属性后快速核心数据崩溃

向核心数据实体添加瞬态属性是不是需要新版本模型?

涉及新实体和一对多关系的核心数据迁移

核心数据异常:向实体添加新属性后出现 SQLite“没有这样的列”错误

为啥实体框架核心加载实体的关系而不添加包含

为啥我不能使用“描述”作为核心数据实体的属性名称?