създаване на връзка на нови обекти въз основа на съществуващо свойство на управляван обект

Имам следния модел на данни:

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

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

Моят 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“

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


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


Отговори (2)


Връзката се създава неявно, когато присвоите EntityD на EntityE чрез връзката „свойство“. Разгледайте заглавните файлове за всеки от тези обекти. Трябва да имате свойство в EntityE като това (предвид връзката към едно от E към D):

@property (nonatomic, retain) EntityD *toD;

Това означава, че трябва да присвоите „обект“ EntityD на newEntityE чрез неговото свойство за връзка към D, както следва:

// assuming EntityD has some property like NSString *name then
newEntityD.name = self.UILabel2.text;
newEntityE.toD = newEntityD;

Изглежда, че се опитвате да присвоите NSString директно, вместо да актуализирате свойството name на newEntityD и след това да присвоите обекта newEntityD на newEntityE чрез връзката.

person Wizkid    schedule 14.07.2014

Предполагам, че използвате NSManagedObject подкласове. В този случай бих ви посъветвал да се отдалечите от тромавите setValue извиквания и вместо това да използвате удобната нотация с точка.

Връзката към toD сочи към EntityD обект, така че не може да бъде низът от текстовото поле. Вместо това задайте entityD:

newEntityE.toD = newEntityD; 
person Mundi    schedule 14.07.2014