如何将一个Core Data模型迁移到一个全新的模型?

时间:2013-10-27 10:29:31

标签: ios objective-c core-data

我正在重写使用核心数据的iOS应用,但目前的对象模型已过时,并未真正反映当前版本的应用使用该模型的方式。例如,有几个实体代表颜色,我想简化为单个NSString属性*。

我知道轻量级迁移并不能解决这类问题,我也不确定是否可以对当前模型进行版本控制并使用手动迁移。是否更容易创建全新的Core Data模型,然后将所有现有项目手动迁移到新模型中? FWIW,通常少于100个项目,我的应用程序不使用iCloud同步,因此迁移到新模型应该相当快。

*我目前有一个具有色调,饱和度和亮度的实体,但我打算转到一个十六进制代码字符串(我现在只使用RGB颜色)。

1 个答案:

答案 0 :(得分:0)

您可以创建新的模型版本,然后使用NSEntityMigrationPolicy将实体从一个模型版本转换为另一个模型版本。

定义新的数据模型版本,填写映射模型并在Custom Policy NSEntityMigrationPolicy文件下设置。

有一篇帖子here可以帮助您开始实体迁移政策。 他们的例子是:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)inSourceInstance
                                 entityMapping:(NSEntityMapping *)inMapping
      manager:(NSMigrationManager *)inManager
                                         error:(NSError **)outError
{

NSManagedObject *newObject;
NSEntityDescription *sourceInstanceEntity = [inSourceInstance entity];

if ( [[sourceInstanceEntity name] isEqualToString:@"Foo"] )
{
  newObject = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
                                                 inManagedObjectContext:[inManager destinationContext]];


  NSDictionary *keyValDict = [inSourceInstance committedValuesForKeys:nil];
  NSArray *allKeys = [[[inSourceInstance entity] attributesByName] allKeys];
  NSInteger i, max;
  max = [allKeys count];
  for (i=0 ; i< max ; i++)
  {
  // Get key and value
  NSString *key = [allKeys objectAtIndex:i];
  id value = [keyValDict objectForKey:key];
  if ( [key isEqualToString:@"Bar"] )
  {
    [newObject setValue:[NSNumber numberWithBool:[value boolValue]] forKey:key];
  }
  else
    [newObject setValue:value forKey:key];
  }

}

[inManager associateSourceInstance:inSourceInstance
             withDestinationInstance:newObject
                     forEntityMapping:inMapping];

return YES;
}

基本上你要做的是回顾keys中的属性(sourceInstance),在示例中称为“Foo”。 sourceInstance是您当前具有色调,饱和度和亮度的实体。对于每个属性,执行你的魔法来创建“单个十六进制代码字符串”。此字符串将成为keynewObject的值。

在此post的末尾,有一个migrateIfNeeded方法可以检查是否需要转换。 (不确定是否需要它或者你已经有了isNeeded逻辑)