2014-07-26 4 views
2

내 프로젝트에서 완전히 다른 모델로 이전하려고합니다. 가벼운 마이그레이션을 위해서는 변경 사항이 너무 많아서 가장 좋은 방법은 최상위 수준의 객체를 반복하고 모든 속성과 관계를 직접 설정하는 것입니다.핵심 데이터 수동 이전

이렇게 완전히 수동으로 마이그레이션 프로세스를 설정하려면 어떻게해야합니까? 나는 NSMappingModel을 필요로하는 NSMigrationManager를 조사했다. 필자가 본 유일한 예제와 튜토리얼은 매핑 모델을 추론 할 수 없기 때문에 사용할 수없는 inferredMappingModelForSourceModel:destinationModel:error:을 사용합니다.

올바른 경로에 있습니까? 그렇다면 어떻게하면 코드에서 수동으로 매핑 모델을 완벽하게 만들 수 있습니까? 도와 주셔서 감사합니다.

답변

1

모델이 변경되어 원본 및 대상 엔티티 수준 매핑이 적어도있는 경우 (예 : 이전 모델에 Vehicle 엔티티가 있고 이제이 데이터를 Car으로 마이그레이션하려는 경우) 이주 정책이있는 사용자 정의 맵핑 모델.

프로세스가 매우 간단합니다. Xcode에서 프로젝트에 새 매핑 모델 파일을 추가하고 소스 모델 버전과 대상 모델 버전을 선택하십시오. Xcode는 원본 및 대상 엔터티의 특성 간 매핑을 파악하는 데 영리합니다. 그렇게 할 수 없다면 매핑을 공백으로 남겨두고 매핑을 직접 설정할 수 있습니다.

단순 할당 또는 공백 이외의 작업을 수행하거나 매핑 중에 속성의 기본값을 설정하려면 NSEntityMigrationPolicy이라는 항목을 사용하십시오. 사용자 정의 매핑을 할 수있는이 방법을 자신의 서브 클래스를 생성 및 구현 :

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)instance 
             entityMapping:(NSEntityMapping *)mapping 
              manager:(NSMigrationManager *)manager 
               error:(NSError **)error { 
    NSArray *_properties = [mapping attributeMappings]; 
    for (NSPropertyMapping *_property in _properties) { 
     if ([[_property name] isEqualToString:@"companyName"]) { 
      NSExpression *_expression = [NSExpression expressionForConstantValue:@"10to1"]; 
      [_property setValueExpression:_expression]; 
     } 
    } 

    return [super createDestinationInstancesForSourceInstance:instance 
               entityMapping:mapping 
                 manager:manager 
                 error:error]; 
} 

사용자 정의 마이그레이션 here을 수행하는 방법에 대한 자세한 내용을보실 수 있습니다.

0

체크 아웃 CDWrangler 경량 및 수동 마이그레이션을 점진적으로 처리 할 수있는 오픈 소스 코어 데이터 컨트롤러입니다.

당신은 당신의 매핑 모델을 생성 한 후, 당신이 필요로하는 모든 사용자 정의 정책은 그냥이

// Migration 
if ([[CDWrangler sharedWrangler] isMigrationNeeded]) { 
    // The key is the name of your starting model, and the value is the name of your mapping model. In this example they are Model.xcdatamodel and MappingModel.xcmappingmodel 
    [CDWrangler sharedWrangler].mappingsForModels = @{@"Model": @"MappingModel"}; 
    [[CDWrangler sharedWrangler] migrate]; 
} 
을 할 필요가
관련 문제