2016-04-29 14 views
2

マッピングモデルを使用してデータモデルを移行しています。コアデータはではなく、私のNSManagedObjectプロパティを削除かかるためコアデータの名前変更属性が「削除済み」

エンティティはという名前の属性が移行されていないを削除しました。

マッピングモデルで自分の属性を使用するにはどうすればよいですか?

値式には何も使用できますか?これは私が今使用しているものである:

enter image description here

ありがとうございました。

+0

私は 'isDeleted'や' getDeleted'を試していますが、(彼らが全く動いても)同じ問題を抱えることを恐れています。 – pbasdf

+0

ここをクリックしてください:http://stackoverflow.com/a/16003894/826716こちら:http://stackoverflow.com/a/4718806/826716私は軽量移行では不可能だと思います。たぶん、NSMigrationManager'を試す価値があります:https://www.objc.io/issues/4-core-data/core-data-migration/。 – bteapot

+0

私は重いマイグレーションのルートを辿ることもなく、マイグレーション後に軽量マイグレーションとデータ処理を行います。 –

答えて

0

私は解決策を見つけた:

私は次のようにMigrationPolicyカスタムを実装:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sourceInstance 
            entityMapping:(NSEntityMapping *)mapping 
             manager:(NSMigrationManager *)manager 
              error:(NSError *__autoreleasing *)error 
{ 
    NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; 

    // Add the old 'deleted' attribute to a renamed attribute 
    [newObject setValue:[NSNumber numberWithBool:[((OldEntityModel *)sourceInstance) deleted]] forKey:@"newDeletedAttribute"]; 

    // Add all the other attributes 
    [newObject setValue:[sourceInstance valueForKey:@"field1"] forKey:@"field1"]; 
    [newObject setValue:[sourceInstance valueForKey:@"field2"] forKey:@"field2"]; 

    // Add the relationships 
    NSSet *relationshipAttribute = [[NSSet alloc] initWithArray:[manager destinationInstancesForEntityMappingNamed:@"OtherEntityToOtherEntity" sourceInstances:@[[sourceInstance valueForKey:@"relationshipAttribute"]]]]; 
    [newObject relationshipAttribute forKey:@"relationshipAttribute"]; 

    [manager associateSourceInstance:sourceInstance withDestinationInstance:newObject forEntityMapping:mapping]; 

    return YES; 
} 

が帰属を削除しアクセスするために、古いモデルのバージョン許可にsourceEntityキャスティング軽量の移行やマッピングモデルではアクセスできない。

1

残念ながら、予約語(私は当時警告を出したと思われます)を使用しました。

あなたの最善の策は軽量な移行を行うことです。この値はではなくに移行します。その後、移行後。データを繰り返し処理し、オブジェクトごとに手動で値を更新します。移行が完了すると古い予約語のプロパティがなくなるため、この操作を1回だけ行う必要があります。

+0

軽量移行中に値を失った場合、その属性をどのように更新できますか? – Matt39

+0

古い属性を削除せずに新しい属性を作成し、移行します。移行後、オブジェクトを反復処理し、新しい値を古い値から設定します。将来のある時点で、使用されていない古い値を削除することができます。 –

関連する問題