Получение и установка значений из базовых элементов данных в Objective-C? - PullRequest
1 голос
/ 06 декабря 2009

У меня есть простое приложение с двумя сущностями:

лицо:

Attributes:
    name
Relationships:
    nativeLanguage: (<<-> Language.natives)
    nonNativeLanguage: (<<-> Language.nonNatives)

Язык:

Attributes:
    name
Relationships:
    natives: (<->> Person.nativeLanguage)
    nonNatives: (<->> Person.nonNativeLanguage)

На экране редактирования для людей у ​​меня есть таблица, в которой перечислены неродные языки, перечисленные для человека, а также раскрывающееся окно для выбора другого языка и кнопка для добавления нового языка в список. список.

Моя цель - создать функцию следующим образом:

- (IBAction)addNonNativeLanguage:(id)sender {
    // tack the language to the end of the list on a many-many relationship
    PersonEntry.nonNativeLanaguages = PersonEntry.nonNativeLanguages + sender;
}

и прикрепите действие к кнопке. Хитрость в том, что, хотя я знаю, как назначать и изменять обычные переменные, я понятия не имею, как изменить содержимое базовых данных за пределами Interface Builder. Как я могу сделать это в Objective-C?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2009

Во всех моих классах сущностей модели Core Data у меня есть следующий код для манипуляции отношениями со многими:

- (void)addNatives:(NSSet*)value_ {
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value_];
    [[self primitiveValueForKey:@"natives"] unionSet:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value_];
}

-(void)removeNatives:(NSSet*)value_ {
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value_];
    [[self primitiveValueForKey:@"natives"] minusSet:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value_];
}

- (void)addNativesObject:(Person*)value_ {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value_ count:1];
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"natives"] addObject:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removeNativesObject:(Person*)value_ {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value_ count:1];
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"natives"] removeObject:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (NSMutableSet*)nativesSet {
    [self willAccessValueForKey:@"natives"];
    NSMutableSet *result = [self mutableSetValueForKey:@"natives"];
    [self didAccessValueForKey:@"natives"];
    return result;
}

Этот код шаблона взят из превосходного mogenerator Вольфа Рентша (который автоматически генерирует его при каждом сохранении модели данных).

Кроме того, обратите внимание, что серверная часть базовых данных для многих связей неупорядочена. Если вы хотите сохранить порядок в ваших данных, вы должны сделать это самостоятельно.

1 голос
/ 06 декабря 2009

Сначала вам нужно найти нужный экземпляр / запись управляемого объекта. Быстрый и грязный способ - спросить элемент интерфейса, который отображает объект person, какой у него объект.

Как только вы получите объект, который вы используете, вызовите mutableSetValueForKey: с именем отношения. Это дает вам изменчивый набор всех связанных языков. Затем вы выбираете нужный языковой объект и добавляете его в набор, используя стандартные методы NSMutableSet.

...