9

관련 모델을 병합하여 생성 된 NSManagedObjectModel 내에서 엔티티가 항상 사용되는 경우 별도의 NSManagedObjectModels에 정의 된 엔티티 간의 관계를 모델링 할 수 있습니까? 예를 들어병합 된 모델에서 NSManagedObjectModel의 모델 간 관계?

는 모델 1 관계 (일대일) toBar으로 Foo 엔티티를 정의하고, 그 모델 (2)가 관계 ​​(일대일) toFoo와 엔티티 Bar 정의 말한다. -[NSManagedObjectModel mergedModelFromModels]을 사용하여 CoreData 스택을 만들고 모델 1과 모델 2를 병합합니다. 데이터 모델러 또는 프로그래밍 방식으로 이러한 관계를 정의하여 모델 관계에있는 것처럼 작동하도록하는 방법이 있습니까?

답변

16

모델 1 또는 모델 2는 형식이 올바르지 않으면 (즉, toBartoFoo 관계에 대상이없는 경우) 런타임에로드 할 수 없습니다. 또한, 모델 1과 모델 2가 동일한 이름의 모델을 가지고 있다면, 이들 모델로부터 병합 모델을 생성 할 수 없습니다. 그들은 합쳐지지 않을 것이고, 충돌 할 것입니다. 이것은 오류입니다.

그러나 수동으로 NSManagedObjectModel API를 사용하여 각 모델을로드하고 두 모델의 엔티티가 포함 된 새 모델을 수동으로 만들 수 있습니다. NSEntityDescriptionNSPropertyDescription 클래스 (및 해당 하위 클래스)는 NSCopying 프로토콜을 구현하므로 대부분의 경우 각 구성 요소 모델에서 전체 모델로 속성을 복사 할 수 있어야합니다.

또한 NS*Description 클래스는 모두 Xcode의 데이터 모델링 도구에서 편집 할 수있는 userInfo 사전을 지원합니다.이 도구를 사용하여 관계 대상에 스탠드 인 태그를 지정할 수 있습니다. 예를 들어, 모델 1에서 userInfoMyRealEntityBar 엔티티를 가질 수 있으며, 병합 된 모델을 만들 때 실제 엔티티를 대신 사용하라는 신호로 확인하십시오.

스탠드 인 역 관계를 독립 엔터티에 넣기를 원할 수도 있습니다. 이것은 병합 후 실제 역으로 대체됩니다. 하지만 모든 모델에서 스탠드 엔티티를 완전히 복제 할 필요는 없습니다. 당신은 실체 모형의 실제 모델에서 사용 된 역관계 만 필요합니다. 실제 Fooname 속성을 가지고 있으며, 실제 바는 kind 속성이있는 경우

따라서, 독립의 FooBar는 독립에 toBartoFoo 관계, 그 필요하지 않습니다.

여기에 내가 무슨 말 보여주는 몇 가지 코드입니다 :

코어 데이터에서 NS*Description 오브젝트의 복사 관계의 대상 개체와 역에 대한 이름으로보다는으로 값 때문에이 작동
- (NSManagedObjectModel *)mergeModelsReplacingDuplicates:(NSArray *)models { 
    NSManagedObjectModel *mergedModel = [[[NSManagedObjectModel alloc] init] autorelease]; 

    // General strategy: For each model, copy its non-placeholder entities 
    // and add them to the merged model. Placeholder entities are identified 
    // by a MyRealEntity key in their userInfo (which names their real entity, 
    // though their mere existence is sufficient for the merging). 

    NSMutableArray *mergedModelEntities = [NSMutableArray arrayWithCapacity:0]; 

    for (NSManagedObjectModel *model in models) { 
     for (NSEntityDescription *entity in [model entities]) { 
      if ([[entity userInfo] objectForKey:@"MyRealEntity"] == nil) { 
       NSEntityDescription *newEntity = [entity copy]; 
       [mergedModelEntities addObject:newEntity]; 
       [newEntity release]; 
      } else { 
       // Ignore placeholder. 
      } 
     } 
    } 

    [mergedModel setEntities:mergedModelEntities]; 

    return mergedModel; 
} 

(그리고 기업의 하부 조직들에게도). 따라서 모델이 변경 가능할 때 (즉, NSPersistentStoreCoordinator의 모델로 설정되기 전에) 이와 같은 트릭을 사용하여 모델을 여러 모델로 분리 할 수 ​​있습니다.