【问题标题】:Magical record migration failing "Can't find model for source store"神奇的记录迁移失败“找不到源存储的模型”
【发布时间】:2014-10-30 06:12:54
【问题描述】:

我们对 CoreData 模型进行了一些更改,但自动迁移似乎失败了。

即使我们将当前模型设置为我们用于生成数据的原始模型,仍然存在错误:

reason = "找不到源存储的模型";

2014-09-05 02:19:43.297[948:166846] -[LBAppDelegate application:willFinishLaunchingWithOptions:] line 132 $ WILL FINISH!!
2014-09-05 02:19:43.402[948:166846] +[LBParse ensureUserObjectExists] line 107 $ dont save
2014-09-05 02:19:52.395[948:166846] CoreData: error: -addPersistentStoreWithType:SQLite configuration:(null) URL:file:///var/mobile/Containers/Data/Application/0B3D4097-940C-433F-B6E5-E0EA6B08992F/Library/Applicat... 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=0x180f8620 {URL=file:///var/mobile/Containers/Data/Application/0B3D4097-940C-433F-B6E5-E0EA6B08992F/Library/Applicat..., metadata={
    NSPersistenceFrameworkVersion = 519;
    NSStoreModelVersionHashes =    {
        AccessItem = <c81a9dbd 17033d2e 91d33b1c fc94ab08 bd3619e2 b5fea24d 6881959a f8023dc5>;
        AccessRule = <e0fd9950 87366a29 fa6702bf 7e7acc3a 86c2f088 3875c341 81414177 4720eee8>;
        Airline = <f8491ecb 2628a003 143b935b 3d3c291b fac507d8 2339af1b 1ac0fe8b 04b73602>;
        Airport = <09e93c0e fbf1e542 d1428584 30549a84 2e0cb9d3 8b50a508 31807dec d7e5f845>;
        Alliance = <b9b53f23 d5962f3f b7a0a3a5 5ca84d83 61d81f7c 0787ca6a dfdfdf21 733b5e4d>;
        AllianceTier = <6ec8bee0 5d4c62f8 1411eaab b464d783 c6388b12 06506824 f11d6453 a58e509a>;
        Amenity = <86065297 64aff55b b7bfec32 e8e14b74 5d7afa5b 751e760e e37e6294 2e40e26a>;
        Data = <92870bec c4a8794e 293dcbe9 93282d69 cb675039 cb9b9bf6 8dda6359 34697663>;
        Event = <de060947 8ec9f2bb 80e341eb 787e7eec 7cc2a09f 356e511c 7d515ca5 130690fe>;
        FeedItem = <1d0d12fc 82eb532a c1a42ad3 57022129 2c44360e ab5514ce a44d6de0 719ca798>;
        Image = <94e1ad81 4a2aa37b 6a02a52e fb481891 5028fafc 0645de55 7316e5d9 f630ca85>;
        Lounge = <57e5d036 c67f1f9d b3c731a6 4136866e 008684b0 f2ec0620 58e6e56c dbbed4fe>;
        ParseObject = <bfa49e8c 1108961a 49848584 0f2fe83f 082bdc6a 2948e09f 68a84c50 2acb0699>;
        Review = <b423b85c 47d15ee8 bbacbfcf 019fb741 165da2ab 5fa6f087 1975bb31 712bdb64>;
        User = <8451767f db80e10a 15ea83d8 83dc1a2c e89d1699 0b302640 59a23144 61c65be0>;
        Vote = <38d267c9 0c44854e dd01201c b728b906 21fd25cd 8343a416 adf769c6 faef7cb6>;
    };
    NSStoreModelVersionHashesVersion = 3;
    NSStoreModelVersionIdentifiers =    (
        ""
    );
    NSStoreType = SQLite;
    NSStoreUUID = "222748EF-2F19-4B87-829C-F8171E439430";
    "_NSAutoVacuumLevel" = 2;
}, reason=Can't find model for source store} with userInfo dictionary {
    URL = "file:///var/mobile/Containers/Data/Application/0B3D4097-940C-433F-B6E5-E0EA6B08992F/Library/Applicat...";
    metadata =    {
        NSPersistenceFrameworkVersion = 519;
        NSStoreModelVersionHashes =        {
            AccessItem = <c81a9dbd 17033d2e 91d33b1c fc94ab08 bd3619e2 b5fea24d 6881959a f8023dc5>;
            AccessRule = <e0fd9950 87366a29 fa6702bf 7e7acc3a 86c2f088 3875c341 81414177 4720eee8>;
            Airline = <f8491ecb 2628a003 143b935b 3d3c291b fac507d8 2339af1b 1ac0fe8b 04b73602>;
            Airport = <09e93c0e fbf1e542 d1428584 30549a84 2e0cb9d3 8b50a508 31807dec d7e5f845>;
            Alliance = <b9b53f23 d5962f3f b7a0a3a5 5ca84d83 61d81f7c 0787ca6a dfdfdf21 733b5e4d>;
            AllianceTier = <6ec8bee0 5d4c62f8 1411eaab b464d783 c6388b12 06506824 f11d6453 a58e509a>;
            Amenity = <86065297 64aff55b b7bfec32 e8e14b74 5d7afa5b 751e760e e37e6294 2e40e26a>;
            Data = <92870bec c4a8794e 293dcbe9 93282d69 cb675039 cb9b9bf6 8dda6359 34697663>;
            Event = <de060947 8ec9f2bb 80e341eb 787e7eec 7cc2a09f 356e511c 7d515ca5 130690fe>;
            FeedItem = <1d0d12fc 82eb532a c1a42ad3 57022129 2c44360e ab5514ce a44d6de0 719ca798>;
            Image = <94e1ad81 4a2aa37b 6a02a52e fb481891 5028fafc 0645de55 7316e5d9 f630ca85>;
            Lounge = <57e5d036 c67f1f9d b3c731a6 4136866e 008684b0 f2ec0620 58e6e56c dbbed4fe>;
            ParseObject = <bfa49e8c 1108961a 49848584 0f2fe83f 082bdc6a 2948e09f 68a84c50 2acb0699>;
            Review = <b423b85c 47d15ee8 bbacbfcf 019fb741 165da2ab 5fa6f087 1975bb31 712bdb64>;
            User = <8451767f db80e10a 15ea83d8 83dc1a2c e89d1699 0b302640 59a23144 61c65be0>;
            Vote = <38d267c9 0c44854e dd01201c b728b906 21fd25cd 8343a416 adf769c6 faef7cb6>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =        (
            ""
        );
        NSStoreType = SQLite;
        NSStoreUUID = "222748EF-2F19-4B87-829C-F8171E439430";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "Can't find model for source store";
}
2014-09-05 02:19:52.404 [948:166846] CoreData: annotation: NSPersistentStoreCoordinator's current model hashes are {
    AccessItem = <c81a9dbd 17033d2e 91d33b1c fc94ab08 bd3619e2 b5fea24d 6881959a f8023dc5>;
    AccessRule = <e0fd9950 87366a29 fa6702bf 7e7acc3a 86c2f088 3875c341 81414177 4720eee8>;
    Airline = <f8491ecb 2628a003 143b935b 3d3c291b fac507d8 2339af1b 1ac0fe8b 04b73602>;
    Airport = <09e93c0e fbf1e542 d1428584 30549a84 2e0cb9d3 8b50a508 31807dec d7e5f845>;
    Alliance = <b9b53f23 d5962f3f b7a0a3a5 5ca84d83 61d81f7c 0787ca6a dfdfdf21 733b5e4d>;
    AllianceTier = <6ec8bee0 5d4c62f8 1411eaab b464d783 c6388b12 06506824 f11d6453 a58e509a>;
    Amenity = <86065297 64aff55b b7bfec32 e8e14b74 5d7afa5b 751e760e e37e6294 2e40e26a>;
    FeedItem = <1d0d12fc 82eb532a c1a42ad3 57022129 2c44360e ab5514ce a44d6de0 719ca798>;
    Image = <94e1ad81 4a2aa37b 6a02a52e fb481891 5028fafc 0645de55 7316e5d9 f630ca85>;
    Lounge = <57e5d036 c67f1f9d b3c731a6 4136866e 008684b0 f2ec0620 58e6e56c dbbed4fe>;
    ParseObject = <bfa49e8c 1108961a 49848584 0f2fe83f 082bdc6a 2948e09f 68a84c50 2acb0699>;
    Review = <b423b85c 47d15ee8 bbacbfcf 019fb741 165da2ab 5fa6f087 1975bb31 712bdb64>;
    User = <8451767f db80e10a 15ea83d8 83dc1a2c e89d1699 0b302640 59a23144 61c65be0>;
    Vote = <38d267c9 0c44854e dd01201c b728b906 21fd25cd 8343a416 adf769c6 faef7cb6>;
}

【问题讨论】:

  • 你能贴一些你的设置代码吗?您如何开启核心数据并启动迁移?
  • 我遇到了同样的错误。但这是我的错。终于发现我无意中改变了旧模型。

标签: core-data magicalrecord


【解决方案1】:

您有一个模型,但它与商店不兼容。在我看来,您在没有添加版本的情况下对模型进行了更改。对于任何 Core Data 迁移,您都需要一个源模型和目标模型。也就是说,Core Data 需要知道原始数据是什么样的,以及新数据是什么样的。然后,Core Data 可以推断(推断)模型之间的更改以进行自动迁移。由于在这种情况下找不到源模型,并且我假设您的项目中仍然有一个模型,因此您很可能在没有添加版本的情况下更改了数据模型。希望您正在使用一些源代码控制,并且可以恢复到与商店匹配的 dat 模型版本。从那里,您需要“添加模型版本”。在其中一个 Xcode 菜单中查找它。您还需要确保新版本是当前模型版本,才能正确启动迁移。

而且,如果您使用的是 MagicalRecord,则可以使用一种简单的辅助方法,在附加存储时迁移数据。

【讨论】:

  • 这太合乎逻辑了,我挣扎了好久。
  • 如果我们确实添加了一个版本但仍然遇到同样的问题怎么办?原始模型没有改变。
  • 与 Maciej 一样,我们也遇到了出现此错误的问题,即使原始模型未更改且新模型仅添加了一个字段。
  • 与 Maciej 和无脑的问题相同。我什至比较了哈希值,模型与商店兼容。所以我不知道怎么了。
  • @MatíasR 我有同样的问题,它与 MagicalRecord 和多个数据模型有关,答案有点长,所以我把它贴在这个下面。祝你好运!
【解决方案2】:

当您以前的版本没有更改,但您有多个 xcdatamodel 文件并使用 mergedModelFromBundles: 加载它们时,也会发生这种情况。这就是MagicalRecord 加载模型文件的方式。

因此,如果您的依赖项(可能来自您的 pod)具有另一个 xcdatamodel,那么您的实际 source data model 将与您从中迁移的那个不同,因为源数据模型表示所有内容的合并模型由于mergedModelFromBundles:

要解决此问题,您需要创建一个与存储内容相匹配的旧版本,而不仅仅是之前版本中的内容。为此,将缺少的模型添加到您要从中迁移的source data model,然后从另一个xcdatamodel 获取这些模型。幸运的是,您可以通过在实体列表中选择它们来复制和粘贴整个模型。

例如:

之前:(失败)

Main.xcdatamodel 
  Version 2: Users, Posts, Comments
  Version 1: Users, Posts
Other.xcdatamodel
  Version 1: Events, Data

之后:

Main.xcdatamodel 
  Version 2: Users, Posts, Comments
  Version 1: Users, Posts, Events, Data
Other.xcdatamodel
  Version 1: Events, Data

存储数据模型:

Version 1: Users, Posts, Events, Data
Version 2: Users, Posts, Comments, Events, Data

【讨论】:

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