Создавать отношения новых объектов на основе существующего свойства управляемого объекта

У меня есть следующая модель данных:

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; 
Другие вопросы по тегам