Pregunta

Tengo una sencilla aplicación con dos entidades:

Persona:

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

Idioma:

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

En la pantalla de edición para la gente, tengo una pantalla de mesa puesta para listar los idiomas no nativos que figuran para la persona, junto con un cuadro desplegable para que elijan otro idioma y un botón para añadir el nuevo idioma la lista.

Mi objetivo es crear una función de la siguiente manera:

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

y adjuntar la acción al botón. Truco es, aunque sé cómo asignar y modificar las variables regulares, no tengo ni idea de cómo modificar el contenido de la base de datos fuera del Interface Builder. ¿Cómo puedo hacer que en Objective-C?

¿Fue útil?

Solución

En todas mis clases de entidad modelo Core Data, tengo el siguiente código para a-muchos relación manipulación:

- (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 de la plantilla es de muy excelente mogenerator (que genera automáticamente de manera apropiada a cada ahorrar del modelo de datos).

Además, tenga en cuenta que el servidor de datos básicos para las relaciones-a-muchos es desordenada. Si desea mantener una orden a sus datos, usted tiene que hacerlo usted mismo.

Otros consejos

Usted primero tiene que encontrar la instancia / registro managedObject desea. La forma más rápida y sucia es pedir al elemento de la interfaz que está mostrando el objeto persona qué objeto tiene.

Una vez que tenga el objeto que utilice mutableSetValueForKey: llamada con el nombre de la relación. Esto le da un conjunto mutable de todos los languges relacionados. A continuación, buscar el objeto de lenguaje adecuado y añadirlo al conjunto mediante los métodos estándar NSMutableSet.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top