9

Можно ли моделировать отношения между объектами, которые определены в отдельных NSManagedObjectModels, если сущности всегда используются в NSManagedObjectModel, который создается путем слияния соответствующих моделей?Перекрестные отношения модели в NSManagedObjectModel из объединенных моделей?

Например, скажем, модель 1 определяет объект Foo с соотношением (один к одному) toBar и что модель 2 определяет объект Bar с соотношением (один к одному) toFoo. Я построю стек CoreData, используя -[NSManagedObjectModel mergedModelFromModels], объединив модель 1 и модель 2. Есть ли способ определить эти отношения либо в моделирезме данных, либо программно, чтобы они вели себя так, как если бы они были в модельных отношениях?

ответ

16

Ни модель 1, ни модель 2 не будут загружаться во время выполнения, если они не были хорошо сформированы, то есть, если у отношений toBar и есть пункты назначения. Кроме того, если модели 1 и модель 2 имеют модели с одинаковым именем, вы не сможете создать из них объединенную модель; они не будут объединены, они будут сталкиваться, что является ошибкой.

Однако вы можете использовать API NSManagedObjectModel вручную для загрузки каждой модели и создания новой модели вручную, содержащей сущности из обоих. Классы NSEntityDescription и NSPropertyDescription (и его подклассы) реализуют протокол NSCopying, поэтому в большинстве случаев вы должны просто копировать свойства из каждой модели компонента в общую модель.

Кроме того, классы NS*Description поддерживают словарь словаря userInfo, который вы можете редактировать в инструменте моделирования данных Xcode, который вы можете использовать, чтобы выполнять те же действия, что и тег назначения отношений как stand-in. Например, в модели 1 у вас может быть объект Bar с ключом userInfoMyRealEntity и проверить это при создании объединенной модели в качестве сигнала для использования реальной сущности.

Вы также захотите установить обратные взаимозависимые отношения с вашими резервными объектами; после слияния они будут заменены реальными инверсиями. Тем не менее, вам не нужно полностью копировать свои резервные объекты во всех моделях; вам нужны только обратные отношения, используемые в вашей реальной модели в подставке в сущности.

Таким образом, если ваш реальный 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, вы можете использовать трюки, подобные этому, чтобы разбить вашу модель на несколько моделей.

 Смежные вопросы

  • Нет связанных вопросов^_^