모델 1 또는 모델 2는 형식이 올바르지 않으면 (즉, toBar
및 toFoo
관계에 대상이없는 경우) 런타임에로드 할 수 없습니다. 또한, 모델 1과 모델 2가 동일한 이름의 모델을 가지고 있다면, 이들 모델로부터 병합 모델을 생성 할 수 없습니다. 그들은 합쳐지지 않을 것이고, 충돌 할 것입니다. 이것은 오류입니다.
그러나 수동으로 NSManagedObjectModel
API를 사용하여 각 모델을로드하고 두 모델의 엔티티가 포함 된 새 모델을 수동으로 만들 수 있습니다. NSEntityDescription
및 NSPropertyDescription
클래스 (및 해당 하위 클래스)는 NSCopying
프로토콜을 구현하므로 대부분의 경우 각 구성 요소 모델에서 전체 모델로 속성을 복사 할 수 있어야합니다.
또한 NS*Description
클래스는 모두 Xcode의 데이터 모델링 도구에서 편집 할 수있는 userInfo
사전을 지원합니다.이 도구를 사용하여 관계 대상에 스탠드 인 태그를 지정할 수 있습니다. 예를 들어, 모델 1에서 userInfo
키 MyRealEntity
인 Bar
엔티티를 가질 수 있으며, 병합 된 모델을 만들 때 실제 엔티티를 대신 사용하라는 신호로 확인하십시오.
스탠드 인 역 관계를 독립 엔터티에 넣기를 원할 수도 있습니다. 이것은 병합 후 실제 역으로 대체됩니다. 하지만 모든 모델에서 스탠드 엔티티를 완전히 복제 할 필요는 없습니다. 당신은 실체 모형의 실제 모델에서 사용 된 역관계 만 필요합니다. 실제 Foo
가 name
속성을 가지고 있으며, 실제 바는 kind
속성이있는 경우
따라서, 독립의
Foo
및
Bar
는 독립에
toBar
및
toFoo
관계, 그 필요하지 않습니다.
여기에 내가 무슨 말 보여주는 몇 가지 코드입니다 :
코어 데이터에서
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
의 모델로 설정되기 전에) 이와 같은 트릭을 사용하여 모델을 여러 모델로 분리 할 수 있습니다.