Получение и установка значений из элементов основных данных в Objective-C?

StackOverflow https://stackoverflow.com/questions/1855069

Вопрос

У меня есть простое приложение с двумя объектами:

Человек:

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?

Это было полезно?

Решение

Во всех классах сущностей модели 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;
}

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

Также обратите внимание, что серверная часть Core Data для отношений «ко-многим» неупорядочена.Если вы хотите поддерживать порядок в своих данных, вам придется сделать это самостоятельно.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top