0

Core Data を使用する iOS アプリを書き直そうとしていますが、現在のオブジェクト モデルは古く、現在のバージョンのアプリがモデルをどのように使用しているかを実際には反映していません。たとえば、単一の NSString プロパティにまで単純化したい色などを表すエンティティがいくつかあります*。

軽量の移行ではこのようなことに対応できないことはわかっています。また、現在のモデルをバージョン管理して手動移行を使用できるかどうかもわかりません。まったく新しい Core Data モデルを作成してから、既存のすべての項目を手動で新しいモデルに移行する方が簡単でしょうか? FWIW、通常、アイテムは 100 未満であり、私のアプリは iCloud 同期を使用していないため、新しいモデルへの移行はかなり迅速に行われるはずです。

*現在、色相、彩度、明度を持つエンティティがありますが、単一の 16 進コード文字列に移行する予定です (現在は RGB 色のみを使用しています)。

4

1 に答える 1

0

新しいモデル バージョンを作成してから、NSEntityMigrationPolicy を使用してエンティティをあるモデル バージョンから別のモデル バージョンに変換できます。

新しいデータ モデル バージョンを定義し、マッピング モデルを入力しCustom Policyて、NSEntityMigrationPolicy ファイルの下に設定します。

エンティティ移行ポリシーを開始するための投稿がここにあります。その例は次のとおりです。

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

基本的に行うことは、例では「Foo」と呼ばれるの属性 ( keys) を調べることです。sourceInstancesourceInstance、色相、彩度、明るさを持つ現在のエンティティです。各属性に対して魔法を実行して、「単一の 16 進コード文字列」を作成します。この文字列は の の値になりkeyますnewObject

この投稿migrateIfNeededの最後に、変換が必要かどうかを確認する方法があります。(それが必要かどうか、または isNeeded ロジックが既に配置されているかどうかはわかりません)

于 2013-10-28T13:51:22.200 に答える