Ich entwickle eine iPhone-Anwendung und bin neu in Objective-C sowie SQLite. Davon abgesehen habe ich mit dem Entwurf einer praktischen Datenverwaltungslösung zu kämpfen, die es wert ist vorhanden zu sein. Jede Hilfe würde sehr geschätzt werden.Was ist die praktischste Lösung für das Datenmanagement mit SQLite auf dem iPhone?
Hier ist der Deal:
Die Mehrzahl der Daten meiner Anwendung interagiert mit in fünf Tabellen in der lokalen SQLite-Datenbank gespeichert wird. Jede Tabelle hat eine entsprechende Klasse, die Initialisierung, Hydration, Austrocknung, Löschen usw. für jedes Objekt/Zeile in der entsprechenden Tabelle behandelt. Wenn die Anwendung geladen wird, füllt sie fünf NSMutableArrays (eine für jeden Objekttyp). Zusätzlich zu einem Primärschlüssel verfügt jede Objektinstanz immer über ein ID-Attribut, unabhängig vom Hydrationsstatus. In den meisten Fällen ist es eine UUID, die ich dann leicht referenzieren kann.
Vor ein paar Tagen, würde ich einfach auf die Objekte über diese Arrays zugreifen, indem Sie ihre UUID aufspüren. Ich würde dann fortfahren, sie zu hydrieren/dehydrieren, wie ich brauchte. Einige der Objekte, die ich auch habe, haben jedoch ihre eigenen Arrays, die auf die UUIDs anderer Objekte verweisen. Für den Fall, dass ich eines dieser "Kind" -Objekte über seine UUID aufspüren muss, wird es etwas schwieriger.
Um zu vermeiden, durch eines der zuvor erwähnten Arrays aufzählen zu müssen, um die UUID eines "übergeordneten" Objekts zu finden und dann die UUID des "Kindes" zu finden, fügte ich einen DataController mit einer Singleton-Instanz hinzu verarbeiten.
Ich hatte gehofft, dass der DataController einen einzelnen Zugangspunkt zur lokalen Datenbank zur Verfügung stellen und die Dinge einfacher machen könnte, aber ich bin nicht so sicher, dass das der Fall ist. Im Grunde habe ich mehrere NSMutableDicationaries erstellt. Wenn der DataController initialisiert wird, listet er alle zuvor erwähnten NSMutableArrays auf, die im Anwendungsdelegaten verwaltet werden, und erstellt ein Schlüssel/Wert-Paar im entsprechenden Wörterbuch, wobei das angegebene Objekt als Wert und seine UUID als Schlüssel verwendet wird.
Der DataController stellt dann Prozeduren bereit, die es einem Client ermöglichen, die UUID eines gewünschten Objekts aufzurufen, um einen Verweis auf das tatsächliche Objekt abzurufen. Immer wenn es sich um eine Anfrage für ein Objekt handelt, hydratisiert der DataController das betreffende Objekt automatisch und gibt es dann zurück. Ich tat dies, weil ich die Kontrolle über die Hydratation aus der Hand des Kunden nehmen wollte, um zu verhindern, dass ein Objekt, auf das mehrfach Bezug genommen wurde, entwässert wurde.
Ich weiß, dass ich in den meisten Fällen eine veränderbare Kopie des Objekts erstellen und dann das ursprüngliche Objekt ersetzen könnte, aber ich wollte dieses Szenario möglichst vermeiden. Daher habe ich ein zusätzliches Wörterbuch hinzugefügt, um zu überwachen, welche Objekte zu einem bestimmten Zeitpunkt hydriert werden, wobei die UUID des Objekts als Schlüssel und eine fluktuierende Zählung verwendet wird, die die Anzahl der Hydrationen ohne Offset Dehydratisierung darstellt. Mein Ziel bei diesem Ansatz war, dass der DataController automatisch jedes Objekt dehydrierte, sobald die Anzahl der "Hydration Retention" null erreicht hatte. Dies führte jedoch zu erheblichen Speicherverlusten, da der Aufrufer später eine Prozedur aufrufen musste, die die Hydration verlangsamte Aufbewahrungsanzahl des Objekts Es gibt offensichtlich viele Fälle, in denen dies nicht offensichtlich oder vielleicht nicht leicht zu erreichen ist, und wenn nur ein Aufrufobjekt dies nicht richtig tut, stoße ich genau auf das gegenteilige Szenario, das ich eigentlich verhindern wollte. Ironisch, nicht wahr?
Wie auch immer, ich denke, wenn ich mit diesem Ansatz fortfahre, wird es einfach schlecht enden. Ich bin versucht, zu dem ursprünglichen Plan zurückzukehren, aber dabei mache ich mich zum Krüppel und ich bin mir sicher, dass da draußen eine elegantere Lösung schwebt. Wie ich bereits sagte, würde jeder Rat sehr geschätzt werden. Danke im Voraus.
Ich habe darüber nachgedacht, CoreData auszuhändigen, aber es wäre schön, etwas im App Store zu haben, bevor diese Zeit kommt. Ich würde auch gerne meine Anwendung auf andere Plattformen portieren, die CoreData offensichtlich nicht unterstützen werden. – TheAggie