【问题标题】:XCode Cant' Edit CoreData ModelXCode 无法编辑核心数据模型
【发布时间】:2012-11-23 13:28:35
【问题描述】:

使用

将 CoreData 模型添加到我现有的项目后

File > New > File... > Core Data > Data Model

我无法编辑模型。该项目现在包含一个 .xcdatamodeld 包引用,但在 Project Navigator 中单击它与单击文件夹或组具有相同的效果,当前编辑器不会更改。同样右键单击参考并选择“打开为>”不列出任何潜在的编辑器。此外,打开文件检查器面板仅列出“身份”“目标成员”和“文本设置”的设置,它不会列出“核心数据模型”或“版本化核心数据模型”的设置

这并不会对 XCodes 识别文件类型的能力产生任何影响,但我还在构建阶段引用了 CoreData.framework,并在 AppDelegate 中包含了必要的 Core Data 属性。

奇怪的是,我在 Finder 中打开了 .xcdatamodeld 包以公开内部 .xcdatamodel(注意没有尾随的 'd')。双击该文件将按预期使用 Core Data Model Editor 打开 XCode。

更奇怪的是,我创建了一个新的投影并单击了“使用核心数据”复选框。这样做允许我通过在 Project Navigator 中选择 .xcdatamodeld 引用来编辑数据模型。因此,我的机器和 XCode 能够并配置为编辑 CoreData 文件。

就好像 XCode 无法使用 Core Data,除非原始项目是使用“使用 Core Data”复选框创建的。

有没有人遇到过这个问题,您是否能够解决它,以及如何解决?

谢谢!

【问题讨论】:

  • 这里的 Xcode 4.5.2 在最简单的情况下没有这个问题。文件/包的读/写保护有什么奇怪的地方吗?
  • 我还在一个空的应用程序(xcode 4.5.2)中添加了一个模型,在这里编辑没有问题。您也不应该使用除 xcode 之外的任何其他编辑器来编辑文件。
  • 我正在运行版本 4.5 (4G182)。我没有在 XCode 之外编辑过文件。自创建文件以来,我没有接触过它。
  • 升级到 4.5.2 没有效果。我应该提到我正在使用 Cocoapods。在没有核心数据的工作空间中创建新项目或项目,然后添加数据模型似乎运行良好。是否有一些工作区设置或可能导致此问题?
  • 令人惊讶的是,在最初提出这个问题两年后,这个错误仍然存​​在于 Xcode 6 中。

标签: ios core-data


【解决方案1】:

原来我试图将数据模型添加到一个组中,该组引用了一个特定文件夹来存储它的子项。但是该文件夹不存在。这导致 XCode 将数据模型放置在项目根目录中,但同时将其引用为位于项目根目录上方的 2 个目录。更奇怪的是,XCode 并没有通过将文件显示为红色来将其列为丢失。无论哪种方式,XCode 在 Project Navigator 中单击时都会忽略该文件,因为它实际上并不存在于它认为的位置。故事的寓意是:检查您的文件路径和配置的组路径。

【讨论】:

  • 顺便说一句,这也意味着如果您尝试删除您添加的模型,数据文件仍然存在 - 因为该文件的路径错误。肯定是 Xcode 错误
  • 看起来像一个 xcode 错误。就我而言,我正在子文件夹中构建一个子模块。我删除了整个文件夹并重新添加(在添加我的数据模型之后),这导致路径被正确添加。
【解决方案2】:

我今天遇到了这个问题,问题是我的.xcdatamodel 文件被打包在内部 本身(奇怪,我知道)。这是我修复它的方法:

  1. 我在 Finder 中找到了我的 File.xcdatamodel 文件。
  2. 右键单击并选择显示包内容
  3. 里面是File.xcdatamodel 的另一个副本。我将它复制到我的桌面。
  4. 然后我将该文件拖入 Xcode 并打开。

真是一种解脱。 :) 我希望这对其他人有所帮助。

【讨论】:

  • 这里也一样。我“管理”的方式是从另一个项目复制 .xcdatamodeld ,删除除一个之外的所有版本,然后将包装 .xcdatamodeld 添加到项目中。我认为也许当您添加未版本化模型时,您应该添加内部 .xcdatamodel,而不是 .xcdatamodeld。
【解决方案3】:

我们真正的问题是 Xcode 在创建新版本时无法打开/验证数据模型。 含义:拥有第一个 .xcdatamodel,然后是 Editor > Add Model Version... > MyProject 2(作为 .xcdatamodel)。 之后,创建了 MyPoject.xcdatamodeld 但无法打开。

经过数小时的调查,我们发现项目文件中的 .xcurrentversion 文件和 XCVersionGroup 丢失或无效。 原因之一是 xcdatamodeld 版本应该在根文件夹中。

简单快速的解决方案 1:

创建一个新的模型版本并:

  1. 设置根文件夹的路径
  2. Group指定为以前版本所在的子目录。

新的 .xcdatamodeld 现在可以在 Xcode 上工作,但不能移动到根文件夹以外的任何地方

复杂的解决方案2:

要在子文件夹中拥有一个正常工作的 .xcdatamodeld,您必须按照以下步骤手动修改项目文件:

PS:这是我写过的最复杂和最老套的答案。对不起:(

  1. 在先前版本的同一目录中创建一个新的模型版本(即使它使数据模型无效)。
  2. 确保在您的目标中指定了新的 .xcdatamodeld 文件。
  3. 在 Finder 中打开包内容并将所有 xcdatamodel 版本拖放到项目中。
  4. 在文本编辑器中打开 project.pbxproj 文件。
  5. 搜索所有数据模型的新文件并复制其fileId

例子:

75F3199D1B9D80D50030FF46 /* MyProject 2.xcdatamodel in Sources */ = {isa = PBXBuildFile; fileRef = 75F319981B9D80D50030FF46 /* MyProject 2.xcdatamodel */; };
// fileId = 75F3199D1B9D80D50030FF46 /* The first id at the beginning of the line */
  1. 将这些行从PBXBuildFile 部分移动到PBXFileReference 的开头,并像这样更新它们(重复使用fileId)。

例子:

75F3199D1B9D80D50030FF46 /* MyProject 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MyProject 2.xcdatamodel"; sourceTree = "<group>"; };
  1. 现在在PBXBuildFile 部分搜索文件MyPoject.xcdatamodeld 并复制其fileRef

例子:

75F319961B9D7FA50030FF46 /* MyProject.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 75F319931B9D7FA50030FF46 /* MyProject.xcdatamodeld */; };
// fileRef = 75F319931B9D7FA50030FF46
  1. 最后,在project.pbxproj 文件的最后创建XCVersionGroup 部分并重用来自xcdatamodeldfileRef 和所有fileId

示例(没有// cmets):

/* Begin XCVersionGroup section */
        75F319931B9D7FA50030FF46 /* MyProject.xcdatamodeld */ = { // fileRed
            isa = XCVersionGroup;
            children = (
                75F3199D1B9D80D50030FF46 /* MyProject 2.xcdatamodel */, // fileId
                75F319A11B9D80D50030FF46 /* MyProject.xcdatamodel */, // fileId
            );
            currentVersion = 75F3199D1B9D80D50030FF46 /* MyProject 2.xcdatamodel */; // fileId of the current version
            name = MyProject.xcdatamodeld;
            path = Path/To/MyProject.xcdatamodeld; // set the correct path
            sourceTree = "<group>";
            versionGroupType = wrapper.xcdatamodel;
        };
/* End XCVersionGroup section */
    };
    rootObject = 7564EB681B4AB1560065394B /* Project object */;
} /* EOF */
  1. 您现在应该可以在 Xcode 中从所需的子文件夹打开 xcdatamodeld 文件了。
  2. 现在从 xcode 中删除单个 xcdatamodel 文件的额外引用(在开始时创建的那些)。

对不起,答案很长......但问题解决了:D

【讨论】:

  • 我的做法略有不同,但这似乎确实是修复它的唯一方法,而无需在每次需要编辑时将模型移动到项目的根目录(请参阅@TamarackBob 的回答) .删除并重新添加文件并没有解决问题。它看起来真的像 Xcode 中的一个错误。
【解决方案4】:

这在 Xcode 8 中仍然是一个问题。

对我来说,简单的解决方案是将我的 .xcdatamodeld 文件从其(黄色)子组文件夹(在项目文件导航器窗格内 - Xcode 的左侧)拖动到应用程序下的最顶层(那个带有蓝色图标)。 之后,它立即用编辑器打开。

我通过将它拖回子组重新测试,它再次无法在编辑器中打开,然后回到顶层并正确打开...... 我不知道为什么会这样,但至少我可以再次编辑它。

希望这对某人有所帮助。

【讨论】:

    【解决方案5】:

    重启 Xcode 通常可以解决这个问题。

    【讨论】:

    • 重新启动 XCode 和我的机器。甚至运行 lsregister -kill 也无济于事
    【解决方案6】:

    这是我解决问题的方法:

    1. 在 Xcode 文件树中,删除了 .xcdatamodeld 文件。
    2. 当我打开项目文件夹时,文件就在那里。 (Xcode 只删除了引用。)
    3. 我已将其拖回 Xcode 文件树,选中“如果需要则复制项目”。它没有复制,因为知道该文件已经在项目文件夹下。

    问题解决了。

    【讨论】:

      【解决方案7】:

      在第一次选择时会发生这种行为,但选择另一个类然后返回 dataModel 允许我在没有 CoreData 的新项目上进行编辑,然后将 coreData 模型添加到项目中。

      只是想一想,您是否添加了实体,或者您甚至无法访问数据模型视图?

      【讨论】:

      • 我什至无法访问数据模型。这种方法对我不起作用。 XCode 本质上将包视为未知文件类型。
      • 这种行为是否发生在没有 CoreData 然后添加模型的新项目上?
      • MarkM,不,它没有。事后添加数据模型的新项目确实有效。
      【解决方案8】:

      我在 Xcode 中是这样解决的:

      右键单击您的项目(不是您的项目文件夹,我是指带有蓝色 Xcode 图标的那个!),然后选择“新建文件”并选择正确的用于保存数据模型的文件夹。

      注意:在项目文件夹本身或其子文件夹之一上单击“新建文件”无法以某种方式工作..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多