Создавать отношения новых объектов на основе существующего свойства управляемого объекта
У меня есть следующая модель данных:
entityA<-->>entityB<<-->>entityC
entityD<-->>entityE
Обратите внимание, что entityD и entityE не связаны с AC.
Мой DetailViewController получает свойства из управляемых объектов и сохраняет их как новый управляемый объект в managedObjectContext.
В настоящее время я отображаю существующий управляемый объект в UILabels следующим образом:
UILabel1.text = [self.selectedEntityB nameB];
UILabel2.text = [self.selectedEntityA nameA];
Затем я сохраняю в контекст действия сохранения здесь:
- (IBAction)save:(id)sender {
EntityD *newEntityD = [NSEntityDescription insertNewObjectForEntityForName:@"EntityD"
inManagedObjectContext:self.managedObjectContext];
[newEntityD setValue:self.UILabel2.text forKey:@"nameD"];
EntityE *newEntityE = [NSEntityDescription insertNewObjectForEntityForName:@"EntityE"
inManagedObjectContext:self.managedObjectContext];
[newEntityE setValue:self.UILabel1.text forKey:@"nameE"];
NSError *anyError = nil;
BOOL savedSuccessfully = [self.managedObjectContext save:&anyError];
if (!savedSuccessfully) {
}
}
Это работает для установки nameD и nameE. Я пытаюсь создать отношения между вновь созданными объектами для EntityD и EntityE. Допустим, отношения между entityE и entityD являются toD. Я попытался в действии сохранения:
[newEntityE setValue:self.UILabel2.text forKey:@"toD"];
Но я получаю сообщение об ошибке: "NSInvalidArgumentException", причина: "-[__NSCFString managedObjectContext]: нераспознанный селектор отправлен на экземпляр 0x10939fd00"
Как бы я установить отношения между вновь созданными объектами?
2 ответа
Отношение создается неявно, когда вы присваиваете EntityD EntityE через отношение "свойство". Посмотрите на файлы заголовков для каждого из этих объектов. У вас должно быть свойство в EntityE, подобное этому (учитывая отношение "один к одному" от E до D):
@property (nonatomic, retain) EntityD *toD;
Это означает, что вы должны назначить EntityD "объект" для newEntityE через его свойство отношения toD следующим образом:
// assuming EntityD has some property like NSString *name then
newEntityD.name = self.UILabel2.text;
newEntityE.toD = newEntityD;
Похоже, что вы пытаетесь назначить NSString напрямую, а не обновлять свойство name для newEntityD, а затем назначать объект newEntityD для newEntityE через связь.
Я предполагаю, что вы используете NSManagedObject
подклассы. В этом случае я бы посоветовал отойти от громоздких setValue
звонки и вместо этого используйте удобную точку обозначения.
Отношение к toD
указывает на EntityD
объект, поэтому он не может быть строкой из текстового поля. Вместо этого установите entityD:
newEntityE.toD = newEntityD;