NSManagesObject - Erstellen ohne zu speichern

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

  • NSManagesObject - Erstellen ohne zu speichern

    Hallo!

    Ich verwende gerade zum ersten Mal CoreData in einer App und habe dabei noch einige Verständnisprobleme. Konkret geht es darum wie Managed Objects erstellt und gespeichert werden:

    Quellcode

    1. MyMangedObject *myManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"SomeManagedObject" inManagedObjectContext:managedObjectContext];
    2. ...
    3. [managedObjectContext save:&error];


    Soweit ich das verstanden habe ich kann ich ein NSManagedObject nur unter Angabe eines NSMangedObjectContext erstellen (s.o.). Das Objekt "gehört" dann automatisch zu diesem Kontext und wird gespeichert, wenn für diesen Kontext "save" aufgerufen wird.

    Das funktioniert soweit auch alles. Allerdings stoße ich hiermit auf Schwierigkeiten wenn ich Temporäre- oder Dummyobjekte erstellen will:
    In der App soll an verschiedenen Stelle eine Liste von "Personen" angezeigt werden von denen dann ein Eintrag ausgewählt wird. Bislang habe ich immer eine SQLite Datenbank "manuell" (also ohne CoreData) verwendet und dort die Personen ausgelesen und in einem Array gespeichert. Damit immer eine Auswahl möglich ist, habe ich der Liste eine Dummyperson "Alle" hinzugefügt. Dafür habe ich also einfach ein weiteres Person-Objekt erstellt und in die Liste eingefügt.

    In einem Dialog soll zudem eine neue Person angelegt werden können. Dafür werden alle Daten der Person eingegeben, hieraus ein neues Person-Objekt erstellt und dieses zurückgegeben. Ob die neue Person tatsächlich gespeichert oder z.B. beim Abbrechen des Dialogs verworfen wird steht beim Erstellen des Objektes noch nicht fest.

    Beide Fälle sind mit Core Data so nicht möglich. Wenn ich ein Dummyobjekt erstellt ist dieses im Kontext enthalten und wird auch mit diesem Gespeichert. In der Liste kann also kein Objekt enthalten sein, dass nicht zu den "echten" Objekten gehört. Zudem kann der Dialog für die Erstellung einer neuen Person kein Dummyobjekt erstellen bzw. er müsste dieses explizit wieder aus dem Kontext löschen wenn die Person doch nicht erstellt werden soll.

    Natürlich kann man beide Fälle auch anders lösen, die Verwendung von Dummyobjekten empfinde ich aber als die einfachste Lösung. Daher die Frage ob ich das Ganze richtig sehe und sich dies mit CoreDate/NSManagedObject wirklich nicht lösen lässt, oder ob ich man auch hier Dummyobjekte erstellen kann ggf. nie oder später zu einem Kontext hinzugefügt werden.
  • Bereits dein Ansatz ,mit dem Dummyobjekt "Alle" ist eigentlich etwas verkorkst. Managed-Objects sind Modelentitäten und dienen nicht dazu, irgendwas im UI zu zaubern.

    Bei Dialogen auf dem Mac macht man das zuweilen auch so (mir ist ein Dictionary lieber, aber sei's drum), aber da kann auch nicht gespeichert werden. Wie sieht es denn da bei dir aus?
    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"?
  • Vielen Dank für die Rückmeldung!

    Der Eintrag "Alle" ist eigentlich nur ein Beispiel. Allgemein geht es um eine Menge von Objekten von denen ein Teil "echt" existiert (also auch gespeichert wird) und der andere Teil nur "virtuell" existiert (also nicht gespeichert und vom Nutzer nicht verändert wird).

    Folgendes Beispiel ist vielleicht besser:
    Es geht um die Verwaltung von "Mitarbeitern". Für jeden Mitarbeiter soll festgehalten werden an welcher "Maschine" dieser arbeitet. In den Detaileinstellungen eines Mitarbeiter-Objektes kann man also auswählen welches Maschinen-Objekt zu diesem gehört. Auch wenn noch keine anderen Maschinen im Programm hinterlegt wurden, muss immer eine Auswahl möglich sein. Es muss daher ein Standardmaschine geben.

    Für die Auswahl werden also alle Maschinen-Objekte aus der Datenbank gelesen und in einen Array gepackt. Hierzu kommt das Objekt für die Standardmaschine das nicht aus der Datenbank stammt sondern manuell erstellt wurde. Die View für die Auswahl stellt dann einfach jeden Eintrag aus dem Array dar so dass ein Eintrag (= eine Maschine) ausgewählt werden kann.

    Statt dem Standardobjekt könnte natürlich auch irgendein anderer Platzhalter verwendet werden. Der View müsste man dann die Liste der "echten" Objekte und zusätzlich noch die angaben für den Platzhalter (Name, Beschreibung, etc.) übergeben. Wird dann dieser Platzhalter ausgewählt könnte man statt dem Standardobjekt auch NULL speichern. Die Verwendung eines Standardobjektes hat aber klare Vorteile: Überall wo die Werte einer Maschine angezeigt werden kann so einfach Mitarbeiter.Maschine übergeben werden und die korrekten Werte erscheinen. Ohne das Stardardobjekt müsste so geprüft werden ob Mitarbeiter.Maschine == NULL ist um dann entsprechend zu reagieren.


    Es ist also hilfreich Maschinen-Objekte zu erstellen die getrennt von den anderen Maschinen-Objekten verwaltet werden. Ist Maschine aber ein NSManagedObjekt kann ich dieses nicht manuell und nicht getrennt erstellen. Oder doch? Wie geht man hier vor?