Frage

Ich habe eine einfache Anwendung mit zwei Entitäten bekommen:

Person:

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

Sprache:

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

Auf dem Bearbeitungsbildschirm für die Leute, ich habe eine Tabellenanzeige bekam setzen die Nicht-Muttersprache für die Person aufgeführt aufzulisten, zusammen mit einem Drop-Box für sie eine andere Sprache und eine Schaltfläche wählen, um die neue Sprache hinzufügen die folgende Liste.

Mein Ziel ist es, eine Funktion zu erstellen, wie folgt:

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

und die Aktion auf die Schaltfläche befestigen. Trick ist, während ich weiß, wie zuweisen und regelmäßige Variablen zu ändern, habe ich keine Ahnung, wie den Inhalt von Core Data ändern außerhalb von Interface Builder. Wie kann ich es in Objective-C?

War es hilfreich?

Lösung

In allen meinen Core Data-Modell Entitätsklassen, ich habe den folgenden Code für n-Beziehung Manipulation:

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

Dieses Template-Code ist von Wolf Rentzsch ist sehr ausgezeichnet mogenerator (die es automatisch jedes geeignete auf speichern erzeugt des Datenmodells).

Beachten Sie auch, dass der Core Data-Backend für zu-viele Beziehungen ungeordnet ist. Wenn Sie eine Bestellung auf Ihre Daten behalten möchten, müssen Sie es selbst tun.

Andere Tipps

Sie werden zuerst die Managed Instanz / Datensatz Sie finden müssen. Die schnelle und schmutzige Art und Weise ist das Interface-Element zu stellen, die die Person, Objekt anzeigt, welches Objekt sie hat.

Wenn Sie das Objekt haben verwenden Sie Anruf mutableSetValueForKey: mit dem Namen der Beziehung. Dies gibt Ihnen eine veränderbare Menge aller damit verbundenen languges. Sie holen dann das richtige Sprachobjekt und fügen Sie es den Satz der Standard NSMutableSet Methoden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top