【问题标题】:Renaming coredata .xcdatamodeld file and migration重命名 coredata .xcdatamodeld 文件并迁移
【发布时间】:2015-10-18 12:38:27
【问题描述】:

我们有 2 个独立的应用程序,我们已将它们合并到同一工作区中的 2 个目标。两者都有自己的核心数据模型(app1.xcdatamodeldapp2.xcdatamodeld)。

现在两者都在同一个工作区,不需要 2 个模型,因为它们 99% 相似。所以我想把.xcdatamodeld包的名字改成allApps.xcdatamodeld。我能够重命名它,但这样做时我没有找到任何关于迁移行为的参考。

这是错误-

2015-07-28 09:04:06.079 AppName[51306:1423128] CoreData: error:
-addPersistentStoreWithType:SQLite configuration:(null) URL:file:///Users/shani/Library/Developer/CoreSimulator/Devices/EA75A69F-B108-4036-AB3D-B923F83D16DE/data/Containers/Data/Application/B1CB3AF3-DEF4-40DF-9A61-721063ECBB1D/Documents/AppName.sqlite
options:{
    NSInferMappingModelAutomaticallyOption = 1;
    NSMigratePersistentStoresAutomaticallyOption = 1;
    NSSQLitePragmasOption =     {
        "journal_mode" = WAL;
    }; } ... returned error Error Domain=NSCocoaErrorDomain Code=134130 "The operation couldn’t be completed. (Cocoa error
134130.)" UserInfo=0x7fc39c194360 {URL=file:///Users/shani/Library/Developer/CoreSimulator/Devices/EA75A69F-B108-4036-AB3D-B923F83D16DE/data/Containers/Data/Application/B1CB3AF3-DEF4-40DF-9A61-721063ECBB1D/Documents/AppName.sqlite,
metadata={
    NSPersistenceFrameworkVersion = 519;
    NSStoreModelVersionHashes =     {
        Attempt = <b4d1e878 69a97917 e751a67c 89e1887a ae4df1dc f380e4ee c9585f60 f39ff51e>;
        BookmarkFlashcard = <33112f7c 2fa20bec eb2e019c b5d619b4 92be2547 a65fabee 1ac86ab7 92dd77bb>;
        BookmarkQuestion = <38634b49 71f0d43c 6f9fbba9 bc2f1b81 675c9b3c f2da017e fc8de9d8 4e18a4a0>;
        Category = <b0e4d91b 0c0ebc71 ed0f403c 9a0eec20 fc1686aa 0169bc60 4bcc7e57 165bce15>;
    };
    NSStoreModelVersionHashesVersion = 3;
    NSStoreModelVersionIdentifiers =     (
        ""
    );
    NSStoreType = SQLite;
    NSStoreUUID = "F1B37CD0-8B89-4893-A262-1013C3544026";
    "_NSAutoVacuumLevel" = 2; }, reason=Can't find model for source store} with userInfo dictionary {
    URL = "file:///Users/shani/Library/Developer/CoreSimulator/Devices/EA75A69F-B108-4036-AB3D-B923F83D16DE/data/Containers/Data/Application/B1CB3AF3-DEF4-40DF-9A61-721063ECBB1D/Documents/AppName.sqlite";
    metadata =     {
        NSPersistenceFrameworkVersion = 519;
        NSStoreModelVersionHashes =         {
            Attempt = <b4d1e878 69a97917 e751a67c 89e1887a ae4df1dc f380e4ee c9585f60 f39ff51e>;
            BookmarkFlashcard = <33112f7c 2fa20bec eb2e019c b5d619b4 92be2547 a65fabee 1ac86ab7 92dd77bb>;
            BookmarkQuestion = <38634b49 71f0d43c 6f9fbba9 bc2f1b81 675c9b3c f2da017e fc8de9d8 4e18a4a0>;
            Category = <b0e4d91b 0c0ebc71 ed0f403c 9a0eec20 fc1686aa 0169bc60 4bcc7e57 165bce15>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
            ""
        );
        NSStoreType = SQLite;
        NSStoreUUID = "F1B37CD0-8B89-4893-A262-1013C3544026";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "Can't find model for source store"; } 2015-07-28 09:04:06.089 AppName[51306:1423128] CoreData: annotation:
NSPersistentStoreCoordinator's current model hashes are {
    Attempt = <b4d1e878 69a97917 e751a67c 89e1887a ae4df1dc f380e4ee c9585f60 f39ff51e>;
    BookmarkFlashcard = <33112f7c 2fa20bec eb2e019c b5d619b4 92be2547 a65fabee 1ac86ab7 92dd77bb>;
    BookmarkQuestion = <38634b49 71f0d43c 6f9fbba9 bc2f1b81 675c9b3c f2da017e fc8de9d8 4e18a4a0>;
    Category = <b0e4d91b 0c0ebc71 ed0f403c 9a0eec20 fc1686aa 0169bc60 4bcc7e57 165bce15>; }

有没有办法在已经投入生产的应用中将 name1.xdatamodel 重命名为 name2.xdatamodel?

谢谢

【问题讨论】:

  • 您的测试结果如何?
  • @Mundi 添加错误,谢谢。

标签: ios xcode core-data core-data-migration


【解决方案1】:

Try using versioning and lightweight migration,

有关版本控制和迁移的更多信息,您可以check this out.

如果上述方法没有帮助,那么尝试这种方式,

首先,当您在 xcode 中添加核心数据模型时,您实际上会得到一个 .xcdatamodeld 文件,它是一个类似于 .xcodeproj 文件的包。在查找器中,您可以右键单击它并“显示包内容”。您会看到它包含一个 .xcdatamodel 文件。

在我看来,您无法使用 xcode 完全重命名它。 Xcode 会改变你在 UI 中看到的包文件的名称(momd),但在文件系统上它实际上并没有改变。

您得到的 nil 模型错误是因为它找不到新文件名 momd,因为它在磁盘上仍有旧名称。 (我猜)

我通过创建一个具有我想要的名称的新模型来解决这个问题,然后在现有模型中,您可以单击并选择您的实体,然后将它们粘贴到新模型文件中。然后,您可以删除旧的并将所有更改提交到您的 SCM。

您可以从this link.获得有关上述步骤的更多帮助

【讨论】:

    【解决方案2】:

    与其重命名 app1.xcdatamodeld 或 app2.xcdatamodeld,不如创建一个新名称 (allApps.xcdatamodeld)。这个新模型可以只是您想要保留的任何模型的副本。

    然后在两个目标中的每一个中添加一个 .xcmapingmodel 文件并将其链接到 allApps.xcdatamodeld 并执行所需的任何翻译。

    按照 coreData 的工作方式,您需要保留原始的 app1 和 app2 xcdatamodeld 文件,以确保您永远不会破坏碰巧在他们的设备上运行您最旧的应用程序的用户。

    文件 > 新建 > 文件 > 核心数据 > 映射模型。 选择源模型并单击下一步。

    选择目标数据模型并单击下一步。

    在 app2 的另一个目标中再次执行此操作,您应该会没事的。

    【讨论】:

    • 谢谢,我会试试这个
    【解决方案3】:

    只需右键单击 .xcdatamodeld 在 Finder 中显示并重命名它。 从退出的捆绑包中删除并拖放重命名的.xcdatamodeld,现在清理构建,在运行之前检查模型之间的关系,如果有,然后再次运行。

    【讨论】:

      【解决方案4】:
      1. 添加模型版本
      2. 将当前模型版本更改为新版本,然后删除未使用的模型版本step 2 detail

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-02
        • 2011-03-20
        • 2015-08-06
        • 2013-12-14
        • 2016-09-08
        • 2012-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多