iPhone核心数据“自动轻量级迁移”

时间:2009-12-02 01:13:27

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

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

我将以下代码添加到我的委托类中:

- (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]错误:错误

     

Domain = NSCocoaErrorDomain Code = 134130

     

UserInfo = 0x1624d20“操作无法完成。(可可错误   134130.)“2009-12-01 20:04:22.879 Shoppee [25633:207]未解决的错误   错误域= NSCocoaErrorDomain代码= 134130 UserInfo = 0x1624d20   “行动无法完成。(可可错误134130.)”,{       URL = file://localhost/Users/Eric/Library/Application%20Support/iPhone%20Simulator/User/Applications/A8A8FB73-9AB9-4EB7-8F83-82F5B4467AF1/Documents/MyApp.sqlite;       metadata = {           NSPersistenceFrameworkVersion = 241;           NSStoreModelVersionHashes = {               Item =< 869d4b20 088e5c44 5c345006 87d245cd 67ab9bc4 14cadf45   180251e9 f741a98f&gt ;;               Store =< 47c250f4 895e6fd1 5033ab42 22d2d493 7819ba75 3c0acffc   2dc54515 8deeed7a&gt ;;           };           NSStoreModelVersionHashesVersion = 3;           NSStoreModelVersionIdentifiers =(           );           NSStoreType = SQLite;           NSStoreUUID =“8DC65301-3BC5-42BE-80B8-E44577B8F8E1”;       };       reason =“找不到源存储的模型”; }

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

9 个答案:

答案 0 :(得分:143)

概述/完整指南:

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

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

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

    您会看到 .xcdatamodel 文件夹中创建了一个新的.xcdatamodeld(如果您没有,也会创建)。< / p>

  2. 保存。

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

  4. 保存。

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

    选择 .xcdatamodeld 文件夹:

    在Xcode 4中:实用程序侧栏 - &gt;文件检查器 - &gt;版本化核心数据模型 - &gt;选择新架构。

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

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

  6. 保存。

  7. 实现必要的代码以在运行时执行迁移。

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

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

  9. 成功迁移后,可以删除迁移代码(步骤7)。 (由开发人员决定何时可以认为已发布的应用程序的用户已迁移。)

  10. 重要提示:请勿删除旧版本的版本/架构。核心数据需要旧版本才能迁移到新版本。

答案 1 :(得分:26)

我明白了。

设计&gt;数据模型&gt;添加模型版本

答案 2 :(得分:15)

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

  1. 在进行更改之前,请先设计 - &gt;数据模型 - &gt;添加模型版本(您将看到在.xcdatamodel文件夹中创建了新的.xcdatamodeld
  2. 保存
  3. 进行更改
  4. 保存
  5. 运行应用
  6. 步骤#1对于完成这项工作至关重要。我遇到了这个问题,因为我按照这些步骤添加了一个新字段。那很有效。我添加了第二个新字段,但忘了“添加模型版本”,事情爆炸了。

答案 3 :(得分:11)

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

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

答案 4 :(得分:5)

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

答案 5 :(得分:1)

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

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

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

删除/重命名已部署/已安装应用程序的sqlite文件 在错误消息之后直接给出文件名称的位置。 e.g:

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

答案 6 :(得分:1)

进行轻量级迁移时需要注意的事项 -

如果您计划重命名/修改属性,请记住在新模型或旧模型中设置“重命名ID”值。要使用Apple自己的示例,请在XCode 4.3中选择新模型中的paintColor&gt;切换到数据模型检查器&gt;在“版本控制”部分中将“重命名ID”字段设置为“颜色”。对我来说,未执行此步骤会导致运行时错误。同样的错误也是covered here。作为一个新用户,我不允许发布图片,所以这里是imgur link(不是真正的垃圾邮件)。

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

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

以防万一有人遇到这种情况并且以上都没有工作......我正在从模拟器中删除我的应用程序,清理等,但没有任何方法可行。我不得不去模拟器目录并手动运行.sqlite文件以使应用程序再次运行。没有头绪......