【问题标题】:iPhone Core Data "Automatic Lightweight Migration"iPhone Core Data“自动轻量级迁移”
【发布时间】:2010-12-22 06:03:31
【问题描述】:

我正在尝试更新实现核心数据存储的应用。我正在向其中一个实体添加一个属性。

我在委托类中添加了以下代码:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Shoppee.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        NSLog(@"Error: %@",error);
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator;
}

来自以下网址: Doc

执行代码时出现以下错误:

2009-12-01 20:04:22.877

Shoppee[25633:207] 错误:错误

域=NSCocoaErrorDomain 代码=134130

UserInfo=0x1624d20 "操作无法完成。(Cocoa 错误 134130.)" 2009-12-01 20:04:22.879 Shoppee [25633:207] 未解决的错误 错误域=NSCocoaErrorDomain 代码=134130 用户信息=0x1624d20 "操作无法完成。(Cocoa 错误 134130.)", { URL = file://localhost/Users/Eric/Library/Application%20Support/iPhone%20Simulator/User/Applications/A8A8FB73-9AB9-4EB7-8F83-82F5B4467AF1/Documents/MyApp.sqlite; 元数据 = { NSPersistenceFrameworkVersion = 241; NSStoreModelVersionHashes = { 项目 = ; 存储 = ; }; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers = ( ); NSStoreType = SQLite; NSStoreUUID = "8DC65301-3BC5-42BE-80B8-E44577B8F8E1"; }; reason = "找不到源存储的模型"; }

看起来我需要包含原始数据模型,但我不知道该怎么做。有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    我想通了。

    设计 > 数据模型 > 添加模型版本

    【讨论】:

    • 我也有同样的问题。我尝试了很多不同的东西,但仍然得到相同的原因 =“找不到源存储的模型”错误。当你和其他海报说你需要添加原始商店时,你们是什么意思?我发布了:stackoverflow.com/questions/2925918/…
    • 请注意,在 Xcode 4 中,这个菜单选项不见了……它是自动的吗?
    • @makdad - 否。对于 Xcode 4,在项目树中选择您的 xcdatamodeld,然后从菜单栏中选择 Editor -> Add Model Version...
    【解决方案2】:

    对于那些遇到此谷歌搜索的人,请注意,即使使用自动(魔术)迁移,您仍然需要创建原始商店的一个版本和一个新版本,并将新版本设置为当前版本。

    【讨论】:

    • 您能详细说明一下吗?您是什么意思“创建原始商店的一个版本,然后再创建一个新版本”?我只是制作一个 StationStore 3.xcdatamodel 吗?
    • 是的,然后在突出显示新版本时使用设计 -> 数据模型 -> 设置当前版本
    【解决方案3】:

    也适用于 googlers.. 简单的规则,永远不要删除/编辑任何旧的编号版本。添加模型版本时,数字后缀将增加为 2..3..4,这意味着 2 是下一个最旧的 3,依此类推。但要编辑的当前版本是未编号的版本。

    不要删除旧模型版本,因为使用旧模型版本的以前数据库的用户将无法迁移到您的最新数据库模型,除非比较旧模式和最新模式。

    【讨论】:

      【解决方案4】:

      再次对 Google 员工来说,这是您需要做的(假设您已经设置了轻量级迁移):

      1. 在进行更改之前,进行设计 -> 数据模型 -> 添加模型版本 (您将看到在您的 .xcdatamodeld 文件夹中创建了一个新的 .xcdatamodel
      2. 保存
      3. 做出改变
      4. 保存
      5. 运行应用程序

      第 1 步对于完成这项工作至关重要。我遇到了这个问题,因为我已经按照这些步骤添加了一个新字段。那行得通。我添加了第二个新字段,但忘记了“添加模型版本”,事情就搞砸了。

      【讨论】:

      【解决方案5】:

      回顾/完整指南:

      1. 在进行任何更改之前,请创建一个新的模型版本。

        在 Xcode 4 中:选择您的 .xcdatamodel -> 编辑器 -> 添加模型版本。

        在 Xcode 3 中:设计 -> 数据模型 -> 添加模型版本。

        您会看到在您的 .xcdatamodeld 文件夹中创建了一个新的.xcdatamodel(如果没有,也会创建该文件夹)

      2. 保存。

      3. 选择您的新 .xcdatamodel 并根据 the Lightweight Migration documentation 进行您希望使用的更改。

      4. 保存。

      5. 将当前/活动模式设置为新创建的模式。

        选择 .xcdatamodeld 文件夹:

        在 Xcode 4 中:实用工具侧边栏 -> 文件检查器 -> 版本化核心数据模型 -> 选择新架构。

        在 Xcode 3 中:设计 > 数据模型 > 设置当前版本。

        .xcdatamodel 图标上的绿色勾号将移至新架构。

      6. 保存。

      7. 实现在运行时执行迁移所需的代码。

        NSPersistentStoreCoordinator 的创建位置(通常是 AppDelegate 类),对于 options 参数,将 nil 替换为以下代码:

        [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
        
      8. 运行您的应用程序。如果没有崩溃,你可能已经成功迁移了:)

      9. 迁移成功后,即可移除迁移代码(步骤 7)。 (由开发者决定何时可将已发布应用的用户视为已迁移。)

      重要提示:不要删除旧模型版本/架构。 Core Data 需要旧版本才能迁移到新版本。

      【讨论】:

      • 真的需要第 9 步吗?如果是这样,为什么?
      • 我尝试删除旧模型模式文件然后运行应用程序,它似乎运行良好。我不知道为什么。(xcode4.6)
      • 谢谢你和+1!重命名属性或实体时不要忘记重命名 ID...
      • 谢谢! +1!我有一个小问题:我有一个基于文档的应用程序,而我的文档是数据库。我被困在第 7 点,因为我不知道在哪里、如何以及要实现什么代码。谢谢!
      • 第 3 步 +1!重命名实体和关系时出现此错误。第 3 步中链接的文档帮助我以正确的方式重命名并解决了这个问题。
      【解决方案6】:

      以防万一有人遇到这种情况并且上述方法都不起作用...我正在从模拟器中删除我的应用程序,清理等,但没有任何效果。我必须去模拟器目录并手动 rm .sqlite 文件才能让应用程序再次运行。没有线索...

      【讨论】:

        【解决方案7】:

        到目前为止,我只看到如何避免错误消息。

        但是我们如何解决它 - 以防我们已经把事情搞砸了?

        以下解决方案修复了问题,但您会丢失数据库中的数据

        删除/重命名已部署/已安装应用程序的 sqlite 文件
        错误消息后直接给出文件名和位置。例如:

        reason=找不到源存储的模型},{
        URL = "file://localhost/Users/yourName/Library/Application%20Support/iPhone%20Simulator/4.3 /Applications/62F342D4-F007-4F6F-96D2-68F902D3719A/Documents/Locations.sqlite";

        【讨论】:

          【解决方案8】:

          进行轻量级迁移时要记住的一些事项 -

          如果您打算重命名/修改属性,请记住在新模型或旧模型中设置“重命名 ID”值。要使用 Apple 自己的示例,在 XCode 4.3 中,在新模型中选择 paintColor > 切换到 Data Model Inspector > 在“Versioning”部分中将“Renaming ID”字段设置为 Color。对我来说,未能执行此步骤会导致运行时错误。同样的错误也是covered here。作为一个新用户,我不能发布图片,所以这里是imgur link(真的不是垃圾邮件)。

              (Cocoa error 134140.)" UserInfo=0x622b350 {reason=Can't find or automatically infer mapping model for migration
          

          【讨论】:

            【解决方案9】:

            在更改数据模型并在具有不同版本的 sqlite 文件的已安装应用程序上运行时,您也可能会收到此错误。在这种情况下,只需删除已安装的应用并重新运行即可。

            【讨论】:

              猜你喜欢
              • 2011-01-19
              • 1970-01-01
              • 2011-08-29
              • 1970-01-01
              • 1970-01-01
              • 2014-10-06
              • 2011-02-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多