Core Data: Einträge per Code erstellen und bearbeiten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Core Data: Einträge per Code erstellen und bearbeiten


    Hallo Zusammen

    Wie der Titel bereits sagt, habe ich folgende Frage zu CoreData: Wie lassen sich per Code Einträge erstellen und bearbeiten?

    Ich habe ein Textfeld, und wenn ich auf einen Knopf drücke, soll ein neuer Eintrag erstellt werden (also wie wenn man im Interface Builder die add: Funktion eines NSArrayController nutzt). Dies ist eigentlich kein Problem, nun soll aber noch eine Property des Eintrags den Wert des Textfelds annehmen.

    Ich hoffe, das Problem wird klar und jemand kennt eine Lösung :)
  • Hier wird so etwas in einem Apple-Tutorial beschrieben.

    Die Vorgehensweise ist wie folgt:

    Du brauchst:
    - NSObjectController oder NSArrayController A, der an Deinen NSManagedObjectContext gebunden ist und die zu erzeugende Entity verwaltet
    - NSObjectController B für das Textfeld (der z.B. ein NSMutableDictionary verwaltet)

    Binde das Textfeld an den Controller B und schreibe Dir eine eigene IBAction-Methode um die Eingabe hinzuzufügen
    In dieser fragst Du die Daten von B ab (evtl. vorher [ B commitEditing ] aufrufen), rufst [ A newObject ] auf, setzt dessen Werte und fügst es dem Controller A hinzu ( [ A addObject ]

    Quellcode

    1. @interface MyController...
    2. {
    3. IBOutlet NSObjectController *textFieldController;
    4. IBOutlet NSObjectController *entityController;
    5. }
    6. @implementation MyController
    7. - (IBAction)add:(id)sender
    8. {
    9. if ( [ textFieldController commitEditing ] ) {
    10. NSString *text = [ textFieldController valueForKeyPath:@"selection.meinTextKey“ ];
    11. NSManagedObject *entity = [ entityController newObject ];
    12. [ entity setValue:text forKey:@"keyDeinerProperty" ];
    13. ...evtl. weitere Initialisierungen
    14. [ entityController addObject:entity ];
    15. }
    16. }
    Alles anzeigen


    Gruß, Markus
  • Tja, die alte Frage, ob man über einen Bindings-Controller oder direkt einfügt …

    Für Bindings-Controller:
    1. Einfach & schnell.
    2. Funktioniert auch dann, wenn der Array-Controller ein Root-Controller ist, also kein Content-Binding hat.

    Gegen Bindings-Controller:
    1. Seiteneffekte
    2. Wozu? Ich habe mit Bindings nichts am Hut beim Einfügen.

    Ich mache es ohne Bindings-Controller. Bei einem Root-Controller hat man dann das Problem, dass die Anzeige sich nicht aktualisiert, weil ein Root-Controller nicht den Kontext observiert. (Weil dieser nicht observierbar ist, steht irgendwo in der Doku.) IIRC reicht aber ein -rearrange auf. Ich meine mich zu erinnern, dass es in 10.6 auch eine explizite Möglichkeit gibt, alle Root-Controller neu zu triggern. Muss ich aber nachschauen. Das habe ich irgendwann einmal im Vorbeiflug gesehen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Ich mache es ohne Bindings-Controller. Bei einem Root-Controller hat man dann das Problem, dass die Anzeige sich nicht aktualisiert, weil ein Root-Controller nicht den Kontext observiert. (Weil dieser nicht observierbar ist, steht irgendwo in der Doku.) IIRC reicht aber ein -rearrange auf. Ich meine mich zu erinnern, dass es in 10.6 auch eine explizite Möglichkeit gibt, alle Root-Controller neu zu triggern. Muss ich aber nachschauen. Das habe ich irgendwann einmal im Vorbeiflug gesehen.

    Jo, soweit habe ich jetzt nicht gedacht, würde mich interessieren, falls Du es findest.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Markus Müller ()

  • Finde es jetzt jedenfalls bei einer Schnellsuche nicht mehr. Da steht nur, dass -hasChanges jetzt observierbar ist. Das dürfte aber nichts bringen.

    Vielleicht hört derArray-Controller jetzt auch auf eine Notification. Aber irgendwas habe ich mal gesehen, als ich nach etwas anderem schaue. (Bestimmt gibt es hier auch noch einen Zettel damit. Der ist aber nicht einfacher zu finden. *g*)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • @t-on:
    Ja, das hilft mir weiter :)

    Ich habe jetzt per Bindings im IB meinen entityController definiert, und schreibe dann per Code:

    Quellcode

    1. NSManagedObjectContext *context = [entityController managedObjectContext];
    2. NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"EntityName" inManagedObjectContext:context];
    3. [newManagedObject setValue:[textfeld stringValue] forKey:@"PropertyName"];


    Danke an alle!