在没有打开版本控制的情况下更改了核心数据模型

Posted

技术标签:

【中文标题】在没有打开版本控制的情况下更改了核心数据模型【英文标题】:Changed Core Data Model Without Having Versioning Turned On 【发布时间】:2014-03-29 15:36:16 【问题描述】:

我稍微改变了我的核心数据模型(将一些属性设置为optionalnon-optional)。

很遗憾我没有开启自动版本控制...

我昨天已将我的 App 上传到 App Store,Apple 仍在审核中。 我担心它会破坏我的应用程序的现有安装。

这就是为什么我想取消我当前上传的二进制文件并将我的核心数据模型重置为之前的属性设置,然后再次上传应用程序。

这导致我提出以下问题:

如何确定当前数据模型是否与 现有的?这是否纯粹是通过属性比较来完成的 或通过比较核心内容文件中的systemVersion 数据模型? 如何解决我的问题并避免我的应用程序的新版本 会因为数据模型不兼容而导致崩溃

【问题讨论】:

【参考方案1】:

兼容的版本由匹配的版本号确定。

完全按照您的建议解决问题。拉取二进制文件、还原更改、版本模型、重新进行更改、确保启用自动迁移并测试它是否正常工作。

版本号是通过生成一个 32 字节的散列摘要来创建的,用于比较是否相等:

对于每个实体,以下属性必须相同:nameparentisAbstractproperties强>。 classNameuserInfo验证谓词 不进行比较。

对于每个实体中的每个属性,以下属性必须相等:nameisOptionalisTransient isReadOnly,对于属性 attributeType,对于关系 destinationEntityminCountma​​xCount deleteRuleinverseRelationshipuserInfo验证谓词 不进行比较。

Apple ref

从技术上讲,如果您不更改任何不影响版本号的内容,那么您就不需要对模型进行版本控制。请注意,您的更改会影响版本号,因此您需要采取措施。

【讨论】:

在模型编辑器中手动设置属性是否可以,还是需要从Git恢复模型?我更喜欢第一种解决方案。 从 GIT 恢复将重置一切。每次您更改模型中的某些内容时,版本号都会更改。我不知道更改某些内容然后将其更改回来是否会重置版本号 - 我想不会... 但是Core Data如何知道模型是否发生了变化?是检查版本号还是比较属性?

以上是关于在没有打开版本控制的情况下更改了核心数据模型的主要内容,如果未能解决你的问题,请参考以下文章

核心数据轻量级迁移 - 何时版本?

防止核心数据错误

我怎样才能明智地处理版本控制和核心数据模型?

核心数据版本控制和迁移

在用户不知情的情况下使用核心数据更改动态模式

核心数据在没有堆栈的情况下工作