为核心数据(iPhone)实施"自动轻量级迁移"

Ric*_*kiG 50 iphone data-migration core-data

当我向核心数据模型添加新属性时,我想让我的应用程序能够进行自动轻量级迁移.

在Apple的指南中,这是我能找到的主题的唯一信息:

自动轻量级迁移

要请求自动轻量级迁移,请在addPersistentStoreWithType中传递的选项字典中设置适当的标志:configuration:URL:options:error:.您需要将与NSMigratePersistentStoresAutomaticallyOption和NSInferMappingModelAutomaticallyOption键对应的值设置为YES:

NSError *error;
NSURL *storeURL = <#The URL of a persistent store#>;
NSPersistentStoreCoordinator *psc = <#The coordinator#>;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

if (![psc addPersistentStoreWithType:<#Store type#>
    configuration:<#Configuration or nil#> URL:storeURL
    options:options error:&error]) {
    // Handle the error.
}
Run Code Online (Sandbox Code Playgroud)

NSPersistentStoreCoordinator以这种方式初始化:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

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

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

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator;
}
Run Code Online (Sandbox Code Playgroud)

我无法看到我应该在何处以及如何添加Apple代码以使自动轻量级迁移工作?

wil*_*lli 93

这就是我做的自动轻量级迁移(来源:http://brainwashinc.wordpress.com/2010/01/18/iphone-coredata-automatic-light-migration/)

1.在应用程序委托中设置自动迁移的持久存储选项.

将persistentStoreCoordinator创建更改为此(替换YOURDB):

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

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

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

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

  NSError *error = nil;
  persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
  if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    // Handle error
  }

  return persistentStoreCoordinator;
}
Run Code Online (Sandbox Code Playgroud)

2.版本化您的数据模型并编辑新文件.

选择你的xcdatamodel文件设计 - >数据模型 - >添加模型版本(展开你的xcdatamodeld项目)选择"2"(或更高版本)文件,设计 - >数据模型 - >设置当前版本(编辑此版本)

3.在app delegate中指定momd资源.

将您的managedObjectModel实现更改为此(替换YOURDB)

- (NSManagedObjectModel *)managedObjectModel {

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

  NSString *path = [[NSBundle mainBundle] pathForResource:@"YOURDB" ofType:@"momd"];
  NSURL *momURL = [NSURL fileURLWithPath:path];
  managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

  return managedObjectModel;
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以链接到源:http://brainwashinc.wordpress.com/2010/01/18/iphone-coredata-automatic-light-migration/ (14认同)
  • 步骤2在XCode 4.3(至少)中略有不同:要设置当前架构版本,您必须首先选择数据模型,该模型看起来像包含数据模型的"旧"和"新"版本的文件夹.您将在项目导航器中看到它.选择此"文件夹",在右侧的属性检查器中,您将找到"Versioned Core Data Model" - 从下拉框中选择所需的文件. (8认同)

udi*_*ibr 7

起初,上述解决方案对我不起作用.返回的managedObjectModel为0x0.我想这是因为我重命名了不同模型文件的文件名.如果您按照上面的说明进行信件,那么一切正常.

但是,如果您确实更改了模型文件名,那么您可以手动选择"当前"模型文件:让我们说您的原始模型文件是MYMODEL.xcdatamodel之后执行上面的添加模型步骤变成一个目录MY.xcdatamodeld而在它下面你有MYMODEL.xcdatamodel和MYMODEL 2.xcdatamodel将新模型文件重命名为您想要的任何内容,例如,假设您已将空格删除到MYMODEL2.xcdatamodel并编辑其内容.现在在上面的代码中做了

NSString *path = [mainBundle pathForResource:@"MYMODEL2" ofType:@"mom" inDirectory:@"MYMODEL.momd"];
Run Code Online (Sandbox Code Playgroud)