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

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

entityA<-->>entityB<<-->>entityC
entityD<-->>entityE

Обратите внимание, что entityD и entityE не связаны с A-C.

Мой DetailViewController принимает свойства управляемых объектов и сохраняет их как новый управляемый объект в manageObjectContext.

В настоящее время я отображаю существующий управляемый объект в 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 manageObjectContext]: нераспознанный селектор отправлен в экземпляр 0x10939fd00»

Как мне установить отношения между вновь созданными объектами?


person user3411663    schedule 14.07.2014    source источник


Ответы (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 вместо обновления свойства имени newEntityD, а затем назначить объект newEntityD для newEntityE через отношение.

person Wizkid    schedule 14.07.2014

Я предполагаю, что вы используете подклассы NSManagedObject. В этом случае я бы посоветовал отойти от громоздких вызовов setValue и вместо этого использовать удобную запись через точку.

Отношение к toD указывает на объект EntityD, поэтому это не может быть строка из текстового поля. Вместо этого установите entityD:

newEntityE.toD = newEntityD; 
person Mundi    schedule 14.07.2014