0

我正在重写一个使用 Core Data 的 iOS 应用程序,但是当前的对象模型已经过时,并不能真正反映应用程序的当前版本如何使用该模型。例如,有几个实体表示颜色之类的东西,我想将它们简化为单个 NSString 属性*。

我知道轻量级迁移无法应对这种情况,我不确定是否可以对当前模型进行版本化并使用手动迁移。创建一个全新的 Core Data 模型然后手动将所有现有项目迁移到新模型中会更容易吗?FWIW,通常少于 100 个项目,而且我的应用程序不使用 iCloud 同步,因此迁移到新模型应该相当快。

*我目前有一个具有色相、饱和度和亮度的实体,但我计划使用单个十六进制代码字符串(我现在只使用 RGB 颜色)。

4

1 回答 1

0

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

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

这里有一篇文章可以让您开始了解实体迁移政策。他们的例子是:

- (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

在这篇文章的最后,有一种migrateIfNeeded方法可以检查是否需要转换。(不确定您是否需要它,或者您是否已经有 isNeeded 逻辑)

于 2013-10-28T13:51:22.200 回答