Obtendo e definindo valores a partir de elementos Core Data em Objective-C?
-
13-09-2019 - |
Pergunta
Eu tenho uma aplicação simples com duas entidades:
Pessoa:
Attributes:
name
Relationships:
nativeLanguage: (<<-> Language.natives)
nonNativeLanguage: (<<-> Language.nonNatives)
Idioma:
Attributes:
name
Relationships:
natives: (<->> Person.nativeLanguage)
nonNatives: (<->> Person.nonNativeLanguage)
Na tela de edição para as pessoas, eu tenho um conjunto de exibição tabela para listar as línguas não-nativos listados para a pessoa, juntamente com uma caixa suspensa para que eles escolham outra língua e um botão para adicionar a nova linguagem para a lista.
Meu objetivo é criar uma função da seguinte forma:
- (IBAction)addNonNativeLanguage:(id)sender {
// tack the language to the end of the list on a many-many relationship
PersonEntry.nonNativeLanaguages = PersonEntry.nonNativeLanguages + sender;
}
e anexar a ação para o botão. Truque é, enquanto eu sei como atribuir e modificar variáveis ??regulares, eu não tenho nenhuma idéia de como modificar o conteúdo de fora Core Data de Interface Builder. Como posso fazê-lo em Objective-C?
Solução
Em todas as minhas classes de entidade modelo Core Data, eu tenho o seguinte código para o para-muitos manipulação:
- (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;
}
Este código do modelo é de Wolf Rentzsch é muito excelente mogenerator (que gera automaticamente-lo adequadamente sobre cada save do modelo de dados).
Além disso, nota que o Núcleo de Dados backend para relacionamentos para muitos é desordenado. Se você quiser manter uma ordem aos seus dados, você tem que fazê-lo sozinho.
Outras dicas
Você primeiro tem que encontrar a instância managedObject / gravar quiser. A maneira rápida e suja é pedir o elemento de interface que está exibindo o objeto pessoa qual objeto tem.
Depois de ter o objeto que você usar a chamada mutableSetValueForKey:
com o nome do relacionamento. Isto dá-lhe um conjunto mutável de todas as languges relacionados. Você, então, buscar o objeto linguagem adequada e adicioná-lo ao conjunto usando os métodos NSMutableSet padrão.