Ни модель 1, ни модель 2 не будут загружаться во время выполнения, если они не были хорошо сформированы, то есть, если у отношений toBar
и есть пункты назначения. Кроме того, если модели 1 и модель 2 имеют модели с одинаковым именем, вы не сможете создать из них объединенную модель; они не будут объединены, они будут сталкиваться, что является ошибкой.
Однако вы можете использовать API NSManagedObjectModel
вручную для загрузки каждой модели и создания новой модели вручную, содержащей сущности из обоих. Классы NSEntityDescription
и NSPropertyDescription
(и его подклассы) реализуют протокол NSCopying
, поэтому в большинстве случаев вы должны просто копировать свойства из каждой модели компонента в общую модель.
Кроме того, классы NS*Description
поддерживают словарь словаря userInfo
, который вы можете редактировать в инструменте моделирования данных Xcode, который вы можете использовать, чтобы выполнять те же действия, что и тег назначения отношений как stand-in. Например, в модели 1 у вас может быть объект Bar
с ключом userInfo
MyRealEntity
и проверить это при создании объединенной модели в качестве сигнала для использования реальной сущности.
Вы также захотите установить обратные взаимозависимые отношения с вашими резервными объектами; после слияния они будут заменены реальными инверсиями. Тем не менее, вам не нужно полностью копировать свои резервные объекты во всех моделях; вам нужны только обратные отношения, используемые в вашей реальной модели в подставке в сущности.
Таким образом, если ваш реальный Foo
имеет атрибут name
, и ваш реальный бар имеет атрибут kind
, ваша позиция в Foo
и Bar
не нужны те, стой в toBar
и toFoo
отношений.
Вот код демонстрирует, что я говорю о:
- (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;
}
Это работает, потому что копирование NS*Description
объектов в Core Data является по имени, а не по значению относительно объекта назначения отношений и обратного (и к сущности субъекта). Таким образом, в то время как модель изменена, то есть, прежде чем она будет установлена как модель для NSPersistentStoreCoordinator
, вы можете использовать трюки, подобные этому, чтобы разбить вашу модель на несколько моделей.