как CoreData управляет созданием отношений классов? - PullRequest
3 голосов
/ 22 июня 2011

У меня есть класс сущности, правильно определенный в управляемом контексте. Этот класс имеет отношение один ко многим с другим классом.

Графические средства Xcode 4 правильно создали производные классы, и связь представлена ​​NSSet.

Мне интересно, как управляется создание классов отношений. Я имею в виду, что для создания основного объекта я использую

NSManagedObject *newEntity = [NSEntityDescription
insertNewObjectForEntityForName:@"EntityName"
inManagedObjectContext:context];

А как насчет отношений в NSSet? Нужно ли создавать его так же, как родительский объект, и регулярно хранить его в NSSet?

NSManagedObject *child = [NSEntityDescription insertNewObjectForEntityForName:@"ChildName" inManagedObjectContext:context];

NSSet *childSet = [..set creation with child..];
newEntity.child = childSet;

// save newEntity in context

Если да, потому что NSSet является объектом, почему его не нужно создавать, начиная с контекста? Такой вопрос может быть применен ко всем «нормальным» свойствам в сущности, NSString тоже объект, почему достаточно простого newEntity.prop = @ ""?

1 Ответ

3 голосов
/ 22 июня 2011

Для отношений ко многим NSManagedObject имеет метод mutableSetValueForKey:, который возвращает набор, который вы бы использовали. С newEntity и child, определенными выше, вы сделаете что-то вроде этого:

NSMutableSet *childObjects = [newEntity mutableSetValueForKey:@"childRelationship"];
[childObjects addObject:child];

Но вы сказали, что Xcode генерировал пользовательские подклассы для ваших сущностей базовых данных, поэтому у вас есть удобный метод, определенный в классе Parent, который будет называться как addChildObject:. Используя это, вы можете заменить вышеприведенное на более простую версию, но вам также нужно объявить newEntity как экземпляр этого подкласса, а не как общий NSManagedObject:

Parent *parent = [NSEntityDescription insertNewObjectForEntityForName:@"EntityName" inManagedObjectContext:context];
NSManagedObject *child = [NSEntityDescription insertNewObjectForEntityForName:@"ChildName" inManagedObjectContext:context];

[parent addChildObject:child];
...