Как автоматически настроить отношение Core Data при использовании вложенных контекстов
Я изо всех сил пытаюсь найти достойное решение проблемы, которая возникает при использовании вложенных контекстов управляемых объектов в базовых данных. Возьмите модель, которая имеет два enites, Person и Name, где каждый Person имеет отношение один к одному с Именем, и отношение Person к Name не является обязательным. Ранее в личном-awakeFromInsert
метод, я бы автоматически создал объект Name для нового Person:
- (void)awakeFromInsert
{
[super awakeFromInsert];
NSManagedObjectContext *context = [self managedObjectContext];
self.name = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];
}
Это прекрасно работает в одном не вложенном контексте управляемого объекта. Однако, если у контекста есть родительский контекст, при сохранении дочернего контекста создается новый объект Person в родительском контексте, и-awakeFromInsert
снова вызывается на этом новом объектедо свойства и отношения оригинального лица копируются. Таким образом, создается другой объект Name, который затем «отключается», когда копируется существующее отношение имени. Сохранение завершается неудачно, потому что проверка плавающего Имени сейчас-нольperson
отношения не удается. Эта проблема описанаВот как и в других местах.
До сих пор я не смог найти хорошее решение этой проблемы. Ленивое создание отношения в методе get фактически вызывает ту же проблему, потому что getter вызывается внутренним механизмом Core Data, когда новый Person создается в родительском контексте.
Единственное, что я могу придумать, это отказаться от автоматической генерации отношений и всегда создавать отношения явно либо в классе контроллера, который создает Person, либо в удобном методе (например,+[Person insertNewPersonInManagedObjectContext:]
) который вызывается только моим кодом, ивсегда метод, используемый для явного создания нового объекта Person. Возможно, это лучшее решение, но я бы предпочел не быть настолько строгим, чтобы разрешить использовать только один метод для создания управляемых объектов, когда другие методы создания, которые я не могу контролировать, и использование которых я не могу легко проверить / исключить, существуют. С одной стороны, это будет означать несколько подклассов NSArrayController для настройки способа создания управляемых объектов.
Кто-нибудь еще, кто сталкивался с этой проблемой, придумал элегантное решение, которое позволяет одному NSManagedObject автоматически создавать объект отношения после создания / вставки?