从实体中删除属性后迁移 CoreData 时出错
Posted
技术标签:
【中文标题】从实体中删除属性后迁移 CoreData 时出错【英文标题】:Error migrating CoreData after deleted attribute from entity 【发布时间】:2015-11-12 21:08:14 【问题描述】:我的默认数据模型有一个属性 (sectionNumber),我从实体 (Tip) 中删除了该属性。该实体在之前的数据模型中不存在。
重新创建映射模型后,我收到此错误(仅在我测试迁移时):
'NSInvalidArgumentException', reason: 'keypath sectionNumber not found in entity <NSSQLEntity Tip id=3>
我在项目中的任何地方都搜索了 sectionNumber,但没有找到它......有人知道我应该去哪里看吗?
【问题讨论】:
您的版本是什么时候以及您要从中迁移的确切安装内容 我几个月前创建了新版本,但今天我删除了不需要的属性。在我这样做之后,我创建了映射模型。我应该补充一点,即使我没有迁移,现在我也会收到此错误。 【参考方案1】:每次您更改模型时,它都是概念版本的一部分。在此概念发布开始时,您对模型进行版本化,然后进行一组模型更改并创建关联的迁移计划(自动或映射模型)。当您部署此概念版本时,模型版本之间的迁移工作。
如果您在部署后对模型进行了更改,并且没有开始新的概念版本 - 因此您不对模型进行版本化 - 核心数据将看到当前模型已更改,但它不知道如何更改。它无法从中恢复,默认操作是abort
。
您需要回滚游览更改并对模型进行版本化。或者,您接受您正处于概念发布阶段(如果可能)并在重新安装之前删除应用程序...
【讨论】:
概念发布是什么意思? 您将要发布或计划发布给应用商店/用户的一组更改。【参考方案2】:您可以通过以下步骤解决此问题..:
在完成核心数据模型的更改后保存它。
.sqllite 核心数据文件在 appdelegate 代码中的第一个打印路径。
复制路径并打开查找器。
按 Ctrl+G 并粘贴该路径。去删除那个 .sqlite 文件。
现在继续派生数据文件夹路径并删除该文件夹中的所有内容。
现在按 alt 并在产品菜单上选择 clean build folder 选项。
现在运行您的代码,尽情享受吧..
【讨论】:
感谢您的建议,但我仍有问题 - 见上文。 评论消失了......这是我收到此错误:“2015-11-13 11:53:13.377 CREW Emergency Preparedness[1345:70338] *** 由于未捕获而终止应用程序异常'NSInternalInconsistencyException',原因:'+entityForName:在此模型中找不到名为'Tip'的实体。'”这非常令人困惑,因为该实体被命名为 Tips,但在我之前的一项更改中,我试图将其重命名为 Tip .但我已将其还原并删除了所有可能的文件(至少我是这么认为的),它指的是旧名称。 你能告诉我你遇到的问题是什么吗? 问题是应用程序仍在尝试访问名称不存在的实体,但部分原因是我为我拥有的属性留下了一些不正确的提取谓词从新模型中删除。这解释了 sectionNumber 的失败,但没有解释不正确实体名称的问题。但是,一旦我修复了谓词,异常就停止了。以上是关于从实体中删除属性后迁移 CoreData 时出错的主要内容,如果未能解决你的问题,请参考以下文章
在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration