# Problem mit hübschen Schauspielerinnen - Teil 1 | [iOS, Swift, CoreData, Update, Relationship, one-to-many]
Hallo liebe Community … okay ich gebe es zu ich wollte mit dem Titel die nötige Aufmerksamkeit erreichen (sex sells). Daher hier ein etwas gefaktes Beispiel meines eigentlichen Problems, aber das Problem als solches ist leider echt.
## [tltr]
Hauptfragestellung: Ich weiß, wie ich Daten in eine CoreData Relationship 1:n Beziehung anlegen. Aber wie ändere ich die Daten dazu ab?
## [was will ich erreichen / was klappt bis lang]
Gehen wir einmal davon aus, dass ich eine App schreiben möchte, in der ich hübsche Schauspielerin (1. Entity „Actress“) anlegen kann. Und ich für diese Schauspielerin ihren täglichen Workoutplan (2. Entity „Workouts“) anlege. Um es nicht zu kompliziert zu machen: nur 1 Workout pro Tag möglich.
.. bla bla ..
Ich habe also irgendwo einen EditActressViewController. Hier möchte ich sowohl neue als auch geänderte Schauspielerinnen anlegen/updaten. In dem EditActressViewController gibt es sowohl die Möglichkeit die Stammdaten (Name und so) zu speichern als auch die Workout-Tagen (denkt daran nur 1/Tag).
Das neue bzw. erstmalige Speichern sowohl der Stammdaten (Entity Actress) als auch der „Bewegungsdaten“ (Entity Workouts).
hier mal der ..
## [code dazu]
Alles anzeigen
## [was ist mein Problem]
Für die Entity „Actress“ macht mein Code oben ja bereits eine saubere Unterscheidung zwischen „neu anlegen“ und „edit“. Bei dem Update der Workouts fehlt mir gerade jegliche Phantasie, was ich hier machen soll.
siehe oben [tltr]
## [was ich bereits probiert habe]
mit FetchRequest auszulesen, welche Workouts es gibt. Okay, aber was gebe ich für einen predicate an? CoreData ist ja keine Datenbank und ich hätte keinen echten Primärschlüssel im Zugriff. Klar kann ich wenigstens mit predicate auf ‚weekOfDay‘ sicherstellen, dass ich den richtigen Tag abändere.
Oder muss ich tatsächlich
## [Randgruppeninfos]
Vielleicht ist es ja wichtig, wie das Datenmodell aussieht? Muss ich evtl. einen eigenen Primärschlüssel mitangeben (aber dann wäre ich ja langsam weit weg von CoreData und deutlich mehr an Datenbanken dran):
Alles anzeigen
## [Hilfe]
ich weiß, ich weiß: Natürlich helfen mir verbale Denkanstösse, aber ob ihr es glaubt oder nicht … ich freue mich auch echt riesig über (Pseudo-)Codezeilen.
Ansonsten hoffe ich ihr hattet ein biste Spaß beim Lesen des Eintrags ... das wäre ja auch okay!
Fröhliches Ostereier-Jagen
ifeelhorst
evtl. schöner formatiert zu sehender Quellcode
Bildschirmfoto 2016-03-25 um 12.46.55.png
Hallo liebe Community … okay ich gebe es zu ich wollte mit dem Titel die nötige Aufmerksamkeit erreichen (sex sells). Daher hier ein etwas gefaktes Beispiel meines eigentlichen Problems, aber das Problem als solches ist leider echt.
## [tltr]
Hauptfragestellung: Ich weiß, wie ich Daten in eine CoreData Relationship 1:n Beziehung anlegen. Aber wie ändere ich die Daten dazu ab?
## [was will ich erreichen / was klappt bis lang]
Gehen wir einmal davon aus, dass ich eine App schreiben möchte, in der ich hübsche Schauspielerin (1. Entity „Actress“) anlegen kann. Und ich für diese Schauspielerin ihren täglichen Workoutplan (2. Entity „Workouts“) anlege. Um es nicht zu kompliziert zu machen: nur 1 Workout pro Tag möglich.
.. bla bla ..
Ich habe also irgendwo einen EditActressViewController. Hier möchte ich sowohl neue als auch geänderte Schauspielerinnen anlegen/updaten. In dem EditActressViewController gibt es sowohl die Möglichkeit die Stammdaten (Name und so) zu speichern als auch die Workout-Tagen (denkt daran nur 1/Tag).
Das neue bzw. erstmalige Speichern sowohl der Stammdaten (Entity Actress) als auch der „Bewegungsdaten“ (Entity Workouts).
hier mal der ..
## [code dazu]
C-Quellcode
- // FIXME: Pseudo-Code *rofl*
- // save-Funktion innerhalb des EditActressViewControllers
- // zum Editieren als auch erstmaligem Abspeichern
- @IBAction func saveData(sender: UIBarButtonItem) {
- // --- what shall we do with the drunken sailor
- // Unterscheide zwischen neuem Datensatz (newActress) und altem (die 'Else')
- var myActressObject: Actress // CoreData - Entity
- // --> neu anlegen
- if modus == "newActress" {
- myActressObject = NSEntityDescription.insertNewObjectForEntityForName("Actress", inManagedObjectContext: self.moc) as! Actress
- }
- // --> edit
- else {
- myActressObject = handOverActressObject
- }
- // --- Stammdaten
- // Actress-Objekt Befüllung aus TextFields übernehmen / Entity 'Actress'
- myActressObject.name = tfName.text // "z.B. Katie Holmes"
- myActressObject.city = tfCity.text // "z.B. New York"
- // --- "Bewegungsdaten"
- // Workouts-Objekte Befüllung aus TextFields übernehmen / Entity 'Workouts'
- // set definieren
- var workOutSets: Set<Workouts> = Set<Workouts>()
- // wo soll der ganze Krams rein, wenn gefüllt
- // .. für Sonntag
- if checkIfDayIsNotEmpty(tfStart1, time2: tfStopp1) {
- let workOutDay = NSEntityDescription.insertNewObjectForEntityForName("Workouts", inManagedObjectContext: self.moc) as! Workouts
- workOutDay.weekOfDay = 1
- workOutDay.title = tfTitle1.text // z.B. "Jogging with Suri"
- workOutDay.start = tfStart1.text // z.B. "10:00"
- workOutDay.stopp = tfStopp1.text // z.B. "10:01"
- workOutSets.insert(workOutDay)
- }
- // .. für Montag
- if checkIfDayIsNotEmpty(tfStart2, time2: tfStopp2) {
- let workOutDay = NSEntityDescription.insertNewObjectForEntityForName("Workouts", inManagedObjectContext: self.moc) as! Workouts
- // Sonntag
- workOutDay.weekOfDay = 2
- workOutDay.title = tfTitle1.text // z.B. "Instructions with this app developer"
- workOutDay.start = tfStart2.text // z.B. "22:00"
- workOutDay.stopp = tfStopp2.text // z.B. "23:42"
- workOutSets.insert(workOutDay)
- }
- // ...
- myActressObject.relationship2Workouts = NSSet(set: workOutSets)
- // --- Speichern
- // .. hier nur die Kurzversion ;-)
- try! myActressObject.managedObjectContext?.save()
- }
## [was ist mein Problem]
Für die Entity „Actress“ macht mein Code oben ja bereits eine saubere Unterscheidung zwischen „neu anlegen“ und „edit“. Bei dem Update der Workouts fehlt mir gerade jegliche Phantasie, was ich hier machen soll.
siehe oben [tltr]
## [was ich bereits probiert habe]
mit FetchRequest auszulesen, welche Workouts es gibt. Okay, aber was gebe ich für einen predicate an? CoreData ist ja keine Datenbank und ich hätte keinen echten Primärschlüssel im Zugriff. Klar kann ich wenigstens mit predicate auf ‚weekOfDay‘ sicherstellen, dass ich den richtigen Tag abändere.
Oder muss ich tatsächlich
## [Randgruppeninfos]
Vielleicht ist es ja wichtig, wie das Datenmodell aussieht? Muss ich evtl. einen eigenen Primärschlüssel mitangeben (aber dann wäre ich ja langsam weit weg von CoreData und deutlich mehr an Datenbanken dran):
Quellcode
## [Hilfe]
ich weiß, ich weiß: Natürlich helfen mir verbale Denkanstösse, aber ob ihr es glaubt oder nicht … ich freue mich auch echt riesig über (Pseudo-)Codezeilen.
Ansonsten hoffe ich ihr hattet ein biste Spaß beim Lesen des Eintrags ... das wäre ja auch okay!
Fröhliches Ostereier-Jagen
ifeelhorst
evtl. schöner formatiert zu sehender Quellcode
Bildschirmfoto 2016-03-25 um 12.46.55.png
----
Macht's gut und danke für den Fisch
Macht's gut und danke für den Fisch