Получение и установка значений из элементов основных данных в Objective-C?
-
13-09-2019 - |
Вопрос
У меня есть простое приложение с двумя объектами:
Человек:
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.