Domanda

Ho una semplice applicazione con due entità:

Persona:

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

Lingua:

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

Nella schermata di modifica per la gente, ho un display tavola apparecchiata per elencare le lingue non nativi elencati per la persona, insieme ad una casella di riepilogo per loro di scegliere un'altra lingua e un pulsante per aggiungere la nuova lingua per la lista.

Il mio obiettivo è quello di creare una funzione come segue:

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

e collegare l'azione al pulsante. Trucco è, mentre io so come assegnare e modificare le variabili regolari, non ho idea di come modificare i contenuti di Core Data di fuori di Interface Builder. Come posso farlo in Objective-C?

È stato utile?

Soluzione

In tutte le mie classi di entità modello Core Data, ho il seguente codice per la manipolazione a-molti relazione:

- (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;
}

Questo codice modello è da molto eccellente mogenerator (che genera automaticamente in modo appropriato su ogni salvare del modello di dati).

Si noti inoltre che il backend Core Data per le relazioni a-molti è non ordinata. Se si desidera mantenere un ordine ai dati, è necessario farlo da soli.

Altri suggerimenti

Per prima cosa deve trovare la managedObject istanza / record che si desidera. Il modo rapido e sporco è quello di chiedere l'elemento di interfaccia che visualizza l'oggetto persona quale oggetto ha.

Una volta ottenuto l'oggetto che si utilizzare chiamata mutableSetValueForKey: con il nome della relazione. Questo vi dà una serie mutevole di tutti i relativi languges. È, quindi scarica l'oggetto linguaggio corretto e aggiungerlo al set utilizzando i metodi NSMutableSet standard.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top