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

Eri*_*ric 64 iphone core-data core-data-migration ios

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

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

- (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;
}
Run Code Online (Sandbox Code Playgroud)

这来自以下网址: 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"操作无法执行已完成.(Cocoa error 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>; Store = <47c250f4 895e6fd1 5033ab42 22d2d493 7819ba75 3c0acffc 2dc54515 8deeed7a>; }; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers =(); NSStoreType = SQLite; NSStoreUUID ="8DC65301-3BC5-42BE-80B8-E44577B8F8E1"; }; reason ="找不到源存储的模型"; }

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

Sti*_*and 143

概述/完整指南:

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

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

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

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

  2. 保存.

  3. 选择新的.xcdatamodel,让你想按照聘用变化轻量级迁移的文档.

  4. 保存.

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

    随着.xcdatamodeld选择的文件夹:

    在Xcode 4:Utilities侧栏 - > File Inspector - > Versioned Core Data Model - >选择新架构.

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

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

  6. 保存.

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

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

    [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                      [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
    
    Run Code Online (Sandbox Code Playgroud)
  8. 运行你的应用程序 如果没有崩溃,你可能已成功迁移:)

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

重要信息:不要删除旧的模型版本/模式.核心数据需要旧版本才能迁移到新版本.

  • 第9步真的需要吗?如果是这样,为什么? (5认同)
  • 谢谢你和+1!重命名属性或实体时不要忘记重命名ID ... (2认同)

Eri*_*ric 26

我想到了.

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

  • @makdad - 不需要.对于Xcode 4,在项目树中选择你的xcdatamodeld,然后从菜单栏中选择Editor - > Add Model Version .... (7认同)
  • 请注意,在Xcode 4中,这个菜单选项已经消失了......它是自动化的吗? (2认同)

dav*_*000 16

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

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

第1步对于完成这项工作至关重要.我遇到了这个问题,因为我按照这些步骤添加了一个新字段.那很有效.我添加了第二个新字段,但忘了"添加模型版本",事情爆炸了.

  • 在尝试重命名属性时,我遇到了这篇文章,它逐步概述了整个过程.希望它能帮助那些不清楚整个过程的人.http://mobile.tutsplus.com/tutorials/iphone/core-data_schema-versioning-and-lightweight-migrations/ (2认同)

Gmu*_*Gmu 11

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

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


rus*_*elf 5

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

  • 你能详细说明一下吗?你是什​​么意思"创建一个原始商店版本,一个新版本"?我只是制作一个StationStore 3.xcdatamodel吗? (4认同)