core data relationships

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

  • core data relationships

    Hallo zusammen,

    ich bin Björn und im Moment etwas ratlos.

    ich habe bereits mehrere Tutorials zu CoreData und Relationships durch gemacht, und ja auch mehrfach. Aber irgendwie will der letzte Funke nicht überspringen. :(

    Beispiel:
    mehrere Personen können einer Familie angehören.

    eine neue Person erstelle ich mit folgendem Code, der Familien Name ist der Einfachheit direkt im Code hinterlegt:

    Quellcode

    1. @IBAction func addTapped(_ sender: Any) {
    2. let alert = UIAlertController(title: "Add Person", message: "Wie heißt er:", preferredStyle: .alert)
    3. alert.addTextField()
    4. // Configure button handler
    5. let submitButton = UIAlertAction(title: "Add", style: .default){(action) in
    6. let textfield = alert.textFields![0]
    7. let family = Family(context: self.context)
    8. family.name = "Simpson"
    9. // create Person
    10. let person = Person(context: self.context)
    11. person.vorname = textfield.text
    12. person.alter = 20
    13. person.addToFamily(family)
    14. do{
    15. try self.context.save()
    16. }
    17. catch{
    18. }
    19. //refresh TableView
    20. self.fetchPeople()
    21. }
    22. //Add Button
    23. alert.addAction(submitButton)
    24. //show alert
    25. self.present(alert, animated: true, completion: nil)
    26. }
    27. }
    Alles anzeigen


    Mit person.addToFamily(family) wird die Person ja der Familie zugewiesen. Richtig?

    Wenn ich mir nun die SQL Datei anschaue, habe ich in der Family Tabelle mehrere Einträge mit Familie Simpson und in der Tabelle Person mehrere Einträge mit den jeweiligen Namen, richtig zugeordnet mit dem PK-Key.

    Ich möchte nun eine Tabelle mit unterschiedlichen Nachnamen anzeigen, tippe ich auf den Nachnamen, möchte ich alle dazugehörigen Personen in einem separaten Fenster/View was auch immer angezeigt bekommen.

    Wie bekomme ich das hin? Fehlt noch was in meinem Beispiel Code?

    Mit dem Code, lasse ich die Tabelle anzeigen, aktuell Name Vorname:

    Quellcode

    1. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    2. let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
    3. // Get person from array
    4. let family = familyArray![indexPath.row]
    5. cell.textLabel?.text = ("\(family.people!.vorname!) \(family.name!)")
    6. return cell
    7. }


    Wäre cool, wenn ich zumindest einen Denkanstoß bekommen könnte.

    Schöne Grüße, schönes Wochenende
    Björn
  • Hallo ratloser Björn ;)

    Zwei Denkanstösse, wobei der erste ein Gedankenfehler Deinerseits ist, während der zweite mehr das allgemeine Vorgehen betrifft ... und noch ein gut gemeinter Rat zum Abschluss:
    • In Deinem Code oben legst Du zusammen mit einer neuen Person auch immer eine neue Familie an ... auch wenn diese "zufällig" den gleichen Nachnamen hat. Das willst Du wahrscheinlich nicht. Stattdessen müsstest Du in Core Data z. B. mit einem fetchRequest mit passendem Predicate nachschauen, ob schon ein Familien-Objekt mit dem Namen "Simpson" existiert. Falls ja, nutze dieses, nur andernfalls lege die Familie neu an.
    • Um Core Data in einer UITableView anzuzeigen, bietet sich die Verwendung eines NSFetchResultControllers an: Dieser liefert vieles automatisch, worum Du Dich sonst selber kümmern musst: Caching, Reagieren auf Datenänderungen im Hintergrund (z. B. durch iCloud), Animieren von Neuaufnahmen und Löschungen, Zugriff auf die CD-Elemente je Zeile usw. Der erste Zugang ist vielleicht etwas sperrig / aufwändig, aber die investierte Zeit lohnt sich auf jeden Fall!
    • Ich würde - bis auf wenige Ausnahmen zur Kontrolle - die Persistenzschicht in SQL aussen vor lassen: Zumindest mir ist nicht immer 100% klar, warum das DB-Schema so ist wie es ist (@all: Falls eine(r) von Euch eine gute Quelle hat, die diese Struktur erklärt, würde ich mich gerne mal einlesen). Fakt ist, dass die Persistenz von CD ein "Implementierungdetail" seitens Apple ist, das sich nach Belieben ändern kann ... und nicht immer ist diese Schicht eine SQL-DB.
    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • b.boos schrieb:


    vielen Dank für die Denkanstösse!
    [...]
    Ich bin in Swift ein absoluter Neuling. Hatte zwar in Objective-C mal was gemacht, ist aber schon eine Ewigkeit her....
    Da nicht für...

    Ich bin in Swift noch komplett unbeleckt - über Lesen in der Theorie bin ich mangels Motivation noch nicht hinaus gekommen ... daher auch mutig von mir, in diesem Unterforum zu posten. Aber zum Glück hatte Dein Problem nicht viel (gar nichts) mit Swift zu tun ;)

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Oha, schon 3 Monate her...
    Irgendwann wurde ich sozusagen "betriebsblind" für das Thema und hab es links liegen lassen und mal etwas einfacheres gemacht.

    Dann wieder im Internet gestöbert und mir das Buch Swift 5 von M. Kofler gekauft und ja, einzig und allein wegen dem CoreData kram. Muss aber sagen, dass es mir auch in einigen anderen Punkten weitergeholfen hat. Leider sind manche Beispiele zumindest für mich etwas kompliziert geschrieben.

    Ganz gut finde ich diesen Artikel hier: iosdose.com/swift-core-data/ und in Kombination mit dem Buch hab ich es endlich hinbekommen, vielleicht hilf es jemand anderem ebenfalls weiter.

    In den letzen 3 Monaten habe ich wieder einiges dazu gelernt... :thumbsup:

    also,.... weiter gehts.... :D