CoreData Model (vorsicht - wirr)

  • CoreData Model (vorsicht - wirr)

    Hallo,

    ich arbeite momentan an der zweiten Version meiner Lernsoftware. Ganz kurz: Man kann Karteikästen anlegen und darin Karteikarten verwalten.

    Es gibt mehrere Karteikastentypen - ähnlich wie in iTunes gibt es einen Karteikasten (den Library Karteikasten), der alle Karteikarten enthält. Es gibt intelligente Karteikästen (ähnlich den intelligenten Wiedergabelisten), es gibt Karteikasten Ordner, die wieder Karteikästen enthalten können.

    Nun stehe ich vor einem Problem. Jeder Karteikästen enthält viele Karteikarten. Einige Karteikästen ermitteln die in ihnen befindlichen Karteikarten sehr dynamisch - z.B. die intelligenten Karteikästen, die Karteikarten nach definierten "Regeln" finden.

    Ich habe dazu eine abstrakte Entität "AbstractDeck" (also abstrakter Karteikasten) und einige konkrete Entitäten, die von dieser Entität ableiten: "LibraryDeck" (der Library Karteikasten), "SmartDeck" (intelligenter Karteikasten), "GenericDeck" (ein normaler Karteikasten), ...

    [Blockierte Grafik: http://christian-kienle.de/model.jpg]

    Wie gesagt hat jeder Karteikasten - egal welchen Typs viele Karteikarten. Es bietet sich also eine to-many Beziehung an. Super - mit diesem Model hat das auch ganz gut geklappt - allerdings:

    Die Karteikarten, die ein intelligenter Karteikasten enthält will ich ja nicht abspeichern. Ich bräuchte für ihn also eine transiente Beziehung. Ebenso für den Library Karteikasten. Das ist nun aber das Problem. Eine to-many Beziehung ist entweder "transient" oder nicht. Sie kann nicht in einer abgeleiteten Entität transient sein und in einer anderen abgeleiteten nicht.

    Mein erste Gedanke war dann die Card Entität ebenfalls abstrakt zu halten. Die Card Entität wird abstrakt und zwei neue Entitäten leiten von ihr ab:

    TransientCard (eine Karte, die nicht gespeichert wird) und StoredCard (eine Karte, die gspeichert wird).

    Zusätzlich dazu habe ich die "cards" Beziehung von "AbstractDeck" auf transient gestellt und die Zielentität von "Card" auf "TransientCard" gestellt. Die "deck" Beziehung von "TransientCard" ist ebenfalls transient.

    GenericDeck hat eine neue Beziehung "storedCard" erhalten. die auf "StoredCard" verweist.

    [Blockierte Grafik: http://christian-kienle.de/model2.jpg]

    Nun kommt der Trick:

    Das UI sieht so aus: Links wie in iTunes eine Liste mit den Karteikästen. Rechts eine Tabelle mit den in dem ausgewähltem Karteikasten enthaltenen Karteikarten. Gebunden wird immer an "cards". Im AbstractDeck Subclass von GenericDeck überschreibe ich die setCards: und cards: Accessors:

    setCards: reicht die Karten weiter an "storedCards", sodass diese gepseichert werden.

    cards gibt einfach das, was in storedCards gespeichert ist zurück.

    Bisher klappt das so ganz gut - nur frage ich mich, ob ich das nicht zu umständlich mache.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Ich bin mir jetzt nicht sicher, ob ich dein zweites Modell 100% durchschaue und ich weiß auch nicht, wie deine smarten Kästen genau funktionieren, aber warum willst du die Karteikarten in einem smarten Kasten eigentlich nicht speichern?

    Der zusätzlich benötigte Speicherplatz dürfte doch marginal sein, es werden ja bei einer Relation nur die entsprechenden Object IDs gespeichert. Du könntest beim Start sogar noch einen kleinen Performance-Gewinn haben, da du die Predicates erst nach einer Änderung evaluieren müsstest.

    iTunes speichert die in einer smarten Playlist enthaltenen Songs auch statisch (okay, wohl hauptsächlich für die ganzen iLife-Browser, aber egal...)
  • RE: CoreData Model (vorsicht - wirr)

    Wenn ich das alles richtig verstanden habe, dann betriebst du diesen Aufwand nur, um die Beziehungen der intelligenten Kästen nicht zu speichern?

    a) So what? Speicher sie mit.

    b) Lösch halt die Beziehungen beim Speichern und erzeuge sie neu beim Laden.

    c) Fetch Properties
    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"?
  • Ich sehe nur Kästen, die Kästen und Karten enthalten können. Kurzum: einen einfachen Baum.

    Der "Library"-Karteikasten enhält Karteikästen mit einem Attribut, das "Ordner", "Intelligent" oder "normaler Kasten" heißt, neben Karten. Die "besonderen" Kästen enthalten (wieder Kästen) und Karten.

    Eher eine Sache der Relation als des Entities, würde ich sagen.

    No.