【问题标题】:Core Data: Error, "Can't Merge Models With Two Different Entities Named 'foo' "核心数据:错误,“无法将模型与名为 'foo' 的两个不同实体合并”
【发布时间】:2011-03-13 10:58:21
【问题描述】:

我正在开发一个使用 Core Data 的 iPhone 应用程序。大多数时候,我只是在模拟器中进行测试,但偶尔会将应用程序抽到 iPad 上以确保。

我最近更改了我的核心数据模型,现在当我将应用程序发送到 iPad 时,我收到一个 SIGABRT 异常告诉我:

 Can't merge models with two different entities named 'foo'

好的,我明白了。设备上存在旧版本的数据库。所以,我(试图)通过按住应用程序的图标直到它开始摆动来杀死旧版本,然后点击它的“X”。 iPad 询问我是否要删除应用程序及其所有数据。我说是的。

我针对 iPad 重新构建了应用程序,得到了同样的错误。

有什么诀窍可以让旧数据库真正消失吗?

【问题讨论】:

    标签: iphone database file core-data


    【解决方案1】:

    您最终会想要了解model migration,以便在用户升级时自动更新设备上的核心数据数据库。

    但是,如果您处于开发阶段并且没有任何已安装的用户,您可以通过连接设备进入 iTunes、从设备中删除应用程序并同步来清除核心数据数据库。然后将新版本的应用程序拖入 iTunes 并重新同步。你应该有一个干净的模型。

    【讨论】:

      【解决方案2】:

      "不能合并两个模型 名为 'foo' 的不同实体"

      这听起来更像是两个数据模型正在合并。尝试干净地重建您的应用程序。 检查您的项目中是否真的只有一个数据模型。

      默认的核心数据堆栈会加载捆绑包中的所有数据模型

      managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];   
      

      如果存在旧模型,则将它们全部合并。

      【讨论】:

      • 在应用中切换模型时,如果我们在直播应用中有一个旧模型Model1,我们想更新应用并只使用另一个名为Model2的新模型,如果我们从项目中删除Model1?或者Model1 不会从实时应用中删除,除非我们在更新时专门这样做?
      【解决方案3】:

      您的错误消息并不意味着您有两个数据库,即持久存储。这意味着您在 Xcode 项目本身中有两个重叠的模型文件(它们是源文件)。删除构建并不好,因为该项目只是在下一次构建时重新创建错误。

      模型文件不能重叠。您需要删除重复项。重复来自 (1) 具有相同文件的两个版本或 (2) 具有两个模型文件,两者具有相同的实体。

      对于 (1),您需要删除旧的副本。模型文件的扩展名为modelName.xcdatamodel。要查找重复项,请打开目标并在Compile Sources 下检查。目标中包含的所有模型文件都将在此处列出。删除重复项。

      对于 (2),您可以拥有任意数量的模型文件,但您不能拥有两个模型文件中具有相同实体的模型文件。有时,Core Data 新手尝试通过让模型文件共享一个或多个实体来链接到模型文件。如果您这样做了,您将需要从其中一个模型中删除重复的实体。

      【讨论】:

      • 他可能要么重命名了模型,要么设置了一个版本,这两者都会在构建目录中留下一个旧的编译 .mom 文件。这是我看到的这个错误的第一大原因。
      • 很高兴知道。我痴迷于清理我的构建,所以我可能很少遇到这个特定问题。
      【解决方案4】:

      永久存储将一直保留,直到您从设备上删除应用程序,就像在模拟器中一样。如果您真的想重新开始,请从您的 iPad 上删除该应用程序,它将使用新型号。

      但是正如其他人所指出的那样,这不是您遇到的错误,请对您的应用程序进行干净构建(意味着从 Xcode 的菜单中选择构建 -> 清理)并重新构建。如果错误仍然存​​在,那么您的项目中有多个 xcdatamodel 文件正在编译。

      【讨论】:

      • 纯属巧合,我在阅读此答案后不到四个小时就遇到了这个问题。清理并没有解决问题,但在清理之后从模拟器中删除了应用程序。很奇怪。
      • Sim 与构建目录有相同的问题。当您部署新版本时,它不会删除新应用程序中不再引用的文件。像这样的更改也需要从 Sim 中删除应用程序。加入我的雷达?
      • 这似乎是正确的答案。我确实编译了两个 xcdatamodels。我认为 benvolioT 的答案是一种解决方法,没有解决根本问题。
      【解决方案5】:

      对于那些在尝试使用核心数据轻量级迁移后遇到这个问题的人:

      即使按照说明创建数据模型的新版本后,我仍然遇到此问题。我注意到我的应用程序包中有两个“.mom”文件,一个“.mom”和一个包含“.mom”文件的“.momd”目录。

      关键是用这个实现替换为你生成的- (NSManagedObjectModel *)managedObjectModel的实现:

      - (NSManagedObjectModel *)managedObjectModel {
      
          if (managedObjectModel != nil) {
              return managedObjectModel;
          }
      
          NSString *path = [[NSBundle mainBundle] pathForResource:@"Foo" ofType:@"momd"];
          NSURL *momURL = [NSURL fileURLWithPath:path];
          managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
      
          return managedObjectModel; }
      

      其中“Foo”是您的数据模型的名称。

      希望这对某人有用 - 我花了太多时间在墙上敲打我的头。再次感谢苹果! :)

      【讨论】:

      • 有没有人有一个涉及删除应用程序并重新安装的解决方案?这些当前的解决方案都不能修复现有的安装。
      • 但是- (NSManagedObjectModel *)managedObjectModel的实现在哪里我的项目中找不到
      【解决方案6】:

      从您的 iPad 中删除该应用程序,然后重新启动它。 iPad 重启后,进行干净的构建。

      【讨论】:

      • 哇,就是这样!我仔细查看了 Simulator 目录中的文件系统,发现没有关于 CoreData 的nothing,但它不起作用。尽管如此,无论出于何种原因,删除都有帮助。早该尝试的。
      【解决方案7】:

      重命名数据库模型后我遇到了类似的问题。清理、重建和重新安装应用程序后——结果相同:应用程序包中出现了两个不同的名称相同的 .momd 包(oldname.momd 和 newname.momd)。
      我通过在“核心数据模型”(数据模型的文件检查器)面板中将“工具版本”从 4.1 更改为 3.2 解决了这个问题。在此之后,我完全清理并重新构建了项目,然后将此属性改回 4.1 并再次重新清理并重新构建应用程序。
      在这种情况下,Xcode 会针对 *.xcdatamodeld 包中的“内容”创建两个文件“布局”和“元素”(用于旧版本兼容性),这导致 Xcode 的数据模型编译器重新检查模型的名称,并且所有 .应用沙箱中的 momd 捆绑包 - 重新安装应用后仅显示一个。

      【讨论】:

      • 为我工作!谢谢
      【解决方案8】:

      对我来说,只有模拟器的“重置内容和设置”有效。否则我找不到我的项目有任何问题。

      【讨论】:

        【解决方案9】:

        我遇到了同样的问题。
        尝试在 Xcode 中清理 Shift + Cmnd + K 并清理构建文件夹 ALT + Shift + Cmnd + K。这对我来说很好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-28
          • 1970-01-01
          • 1970-01-01
          • 2011-05-30
          • 1970-01-01
          相关资源
          最近更新 更多