重命名 coredata .xcdatamodeld 文件和迁移

Renaming coredata .xcdatamodeld file and migration

我们有 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?

谢谢

Try using versioning and lightweight migration

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

如果上述方法没有帮助,请按此方法尝试,

首先,当你在xcode中添加一个核心数据模型时,你实际上得到一个.xcdatamodeld文件,它是一个类似于.xcodeproj文件的包。在 finder 中,您可以右键单击它并 "Show Package Contents"。您会看到它包含一个 .xcdatamodel 文件。

在我看来,您无法使用 xcode 完全重命名它。 Xcode 将更改包文件的名称(momd),如您在 UI 中所见,但在文件系统上它实际上并未更改。

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

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

您可以从 this link.

获得有关上述步骤的更多帮助

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

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

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

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

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

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

只需单击右键单击 .xcdatamodeld 在 Finder 中显示并重命名。 从捆绑包中删除现有的一个并拖放重命名的 .xcdatamodeld,现在清理构建,检查模型之间的 运行 关系之前是否有和再次 运行。

  1. 添加模型版本
  2. 将当前模型版本更改为新版本,然后删除未使用的模型版本step 2 detail