核心数据“找不到源存储模型”;

Posted

技术标签:

【中文标题】核心数据“找不到源存储模型”;【英文标题】:core data "Can't find model for source store"; 【发布时间】:2014-01-23 11:02:11 【问题描述】:

问题出在这里...我在应用商店中有一个应用程序,它使用核心数据...我一直在正确更新我的模型(使用版本等)但最近我不小心丢失了我的最新模型(那个对应于应用商店),所以现在我得到这个错误:原因=“找不到源商店的模型”;

我已经创建了我的模型,据我所知,我所做的更改与以前的版本完全相同......但我仍然无法让它喜欢我的模型版本。所以我的问题是,我能否以某种方式欺骗核心数据,使其认为它具有正确的版本?或者有没有办法检查哪些实体有问题?我知道核心数据存储模型的哈希以检查版本是否相同,但我不知道版本模型必须相同的程度才能使“哈希检查”成功。 .

任何帮助都会很棒!谢谢!

【问题讨论】:

你不使用版本控制工具比如 git sow 你可以检索旧版本的数据模型吗? 在创建这个新数据模型时,您是否像以前一样迭代数据模型的版本? 是的,我使用 git。这就是问题所在,不知何故新的模态版本没有被跟踪,所以当我切换到另一个分支时它被删除了。而且,是的,我确实从以前的版本进行了迭代 我想您删除的内容不在垃圾箱中,也不在数据模型包中? 如果没有办法恢复有几个选项:如果数据不重要并且您不需要升级您可以修改传递给持久存储的标志 sow 您不会执行轻量级迁移,不幸的是用户将丢失所有存储的数据。 【参考方案1】:

您可以从应用的应用商店副本中恢复数据模型,然后将其导入回您的项目中。 Core Data 模型的编译方式与源代码不同,因此逆向处理通常是有效的。以下假设您已在 Mac 上的 iTunes 中下载了该应用的当前应用商店版本:

首先将应用商店捆绑包复制到安全的地方:

cp ~/Music/iTunes/Mobile\ Applications/YOUR-APP-NAME.ipa /tmp
cd /tmp/

接下来打开那个包,它实际上只是一个 zip 文件。

unzip YOUR-APP-NAME.ipa

这将创建一个名为 Payload 的目录,其中包含应用程序及其捆绑包。捆绑包包含核心数据模型。将其从捆绑包中复制出来:

cp -rp Payload/YOUR-APP-NAME.app/YOUR-MODEL-NAME.momd /tmp/

(调整名称以匹配您的数据模型)。​​

如果您在应用商店中已有多个版本,则模型为包含多个mom 文件的momd。每个mom 文件对应一个模型版本。其中之一就是您需要的。你需要弄清楚哪个是哪个。

现在,切换到 Xcode。创建数据模型的新版本,但不要使其成为最新版本。 删除此版本中的所有内容,所有实体,所有内容。 显示现在为空的模型后,转到Editor 菜单并选择Import...。在文件打开对话框中,从上方导航到 /tmp/ 中的数据模型副本。选择需要恢复的版本,点击“打开”。

该模型版本中的所有实体现在都出现在您刚刚创建的新模型文件中。现在,您可以在进行模型迁移时将此模型用作“原始”模型。

或者,您可以使用我的momdec 项目来反编译模型,而不是导入 Xcode。这将生成一个未编译的 Core Data 模型,您可以将其添加到您的 Xcode 项目中。

【讨论】:

【参考方案2】:

供日后参考,不推荐。

如果模型无法恢复,则可以“伪造”。

    创建一个与您丢失的模型相同的新模型 测试一下,看看你是否走运(不太可能)。 写下 Core Data 在日志中吐出的实体哈希 将这些哈希输入到模型中作为(版本哈希修饰符)中的覆盖 再次运行迁移。 永远不要再修改生产模型。发货时立即将其检查到源代码管理中。

【讨论】:

【参考方案3】:

对于出现在此问题上且未尝试将核心数据模型迁移到另一个模型的任何人,如果您尝试将数据保存到实体中的某些值未设置的核心数据中,也会出现此错误。确保您的所有数据变量都已正确设置和设置,以避免出现 MacBook Pro 骑独角兽的梦想可能永远存在于您的现实中的错误!

【讨论】:

以上是关于核心数据“找不到源存储模型”;的主要内容,如果未能解决你的问题,请参考以下文章

使用 Core Data 轻量级迁移和 UIManagedDocument 的“找不到源存储模型”

核心数据:找不到成员 executeFetchRequest

“找不到源存储的模型”核心数据错误

为啥应用程序找不到我恢复的核心数据文件?

核心数据迁移 - 找不到迁移的映射模型

在此模型中找不到名为“Book”的实体。 ios核心数据错误?