7

現在、エンティティにcardType属性があります。これは、古いモデルでは「Math」、「Image」、または「Text」である可能性があります。新しいモデルでは、「Math」と「Text」だけを使用し、hasImage属性もあります。これは、古いcardTypeがImage(「Text」に変更したい)の場合はtrueに設定します。

最後に、別のエンティティ「カード」のセットがあり、そのセットをデッキに関連付けることができます。それぞれのエンティティには、デッキが「」の場合にtrueに設定したいhasImageもあります。前の「画像」タイプ。

これは、2つのバージョン間で作成したマッピングモデルの値式を使用してすべて可能ですか、それとも何か他のことをする必要がありますか?

値式で何が可能かを正確に説明しているドキュメントが見つかりません(Appleのドキュメント-http ://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreDataVersioning/Articles/vmMappingOverview.html% 23 // apple_ref / doc / uid / TP40004735-SW3-非常に単純な変換のみがあります)。私が何か他のことをしなければならない場合、それは何でしょうか?これは、式がそれを実行できるはずであるほど単純に思えます。

4

1 に答える 1

27

実行できることの1つは、属性を元の値から新しい値にマッピングする関数を持つカスタム移行ポリシークラスを作成することです。たとえば、モデルを複数のストアに分割できるように、代わりにitemIDを格納するために、「Items」と呼ばれる値のエンティティのセットに直接関係するMyItemsと呼ばれるエンティティをマップする必要がある場合がありました。

古いモデルは次のようになりました。 古いモデル

新しいモデルは次のようになります。 新しいモデル

これを行うために、itemIDForItemNameという関数を使用してマッピングクラスを作成し、次のように定義しました。

@interface Migration_Policy_v1tov2 : NSEntityMigrationPolicy {

  NSMutableDictionary *namesToIDs;
}

- (NSNumber *) itemIDForItemName:(NSString *)name;
@end

#import "Migration_Policy_v1tov2.h"

@implementation Migration_Policy_v1tov2


    - (BOOL)beginEntityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error {
        
        namesToIDs = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1],@"Apples",
                      [NSNumber numberWithInt:2],@"Bananas",
                      [NSNumber numberWithInt:3],@"Peaches",
                      [NSNumber numberWithInt:4],@"Pears",
                      [NSNumber numberWithInt:5],@"Beef",
                      [NSNumber numberWithInt:6],@"Chicken",
                      [NSNumber numberWithInt:7],@"Fish",
                      [NSNumber numberWithInt:8],@"Asparagus",
                      [NSNumber numberWithInt:9],@"Potato",
                      [NSNumber numberWithInt:10],@"Carrot",nil];
        return YES;
    }
    - (NSNumber *) itemIDForItemName:(NSString *)name {
        
        NSNumber *iD = [namesToIDs objectForKey:name];
        
        NSAssert(iD != nil,@"Error finding ID for item name:%@",name);
        
        return iD;
    }
    @end

次に、マッピングモデルの属性に関連するマッピング名として、関数呼び出しの結果として値式を指定します。 FUNCTION($entityPolicy,"itemIDForItemName:",$source.name)**

また、その属性のマッピング名のカスタムポリシーフィールドをマッピングクラス名(この場合はMigration_Policy_v1tov2)に設定する必要があります。

**これはメソッドのセレクターシグネチャと一致する必要があることに注意してください

マッピングモデル

于 2011-03-22T00:41:14.580 に答える