Wir haben viele Apps, bei denen wir Daten von Remote-Webdiensten als JSON abrufen und dann mit einem Parser in ein Core-Datenmodell übersetzen.
Für eine unserer Apps denke ich, wir sollten etwas anderes machen.
Diese App hat schreibgeschützte Daten , die flüchtig sind und daher nicht sehr lange lokal zwischengespeichert werden. Der JSON ist tief hierarchisch mit Tonnen verschachtelten "Objekten" . Dokumente enthalten in der Regel nicht mehr als 20 Elemente der obersten Ebene, können aber bis zu 100 KB groß sein.
Ich glaube nicht, dass ich ein Core Data Model mit 100 Entitäten erstellen und dann einen Mapper verwenden möchte, um den JSON dorthin zu importieren. Es scheint so ein Lied und Tanz zu sein. Ich denke, ich möchte einfach den JSON irgendwo einfach bestehen lassen und die Möglichkeit haben, ihn abzufragen. MongoDB wäre in Ordnung, wenn es auf dem iPhone lief.
Gibt es auf dem iPhone einen JSON-Dokumentenspeicher, der Abfragen unterstützt?
Oder kann ich einen JSON-Parser verwenden, um die Daten in eine Art persistentes NSDictionary zu konvertieren und das mithilfe von Prädikaten abzufragen?
Oder verwenden Sie SQLite möglicherweise als BLOB-Speicher mit manuell erstellten Indizes für die JSON-Strukturen?
Oder sollte ich aufhören zu jammern und Core Data zu verwenden? :)
Hilfe geschätzt.
Bei der Entscheidung, welche Persistenz zu verwenden ist, ist es wichtig, sich daran zu erinnern, dass Core Data in erster Linie ein Objektgraph-Managementsystem ist. Die wahre Funktion besteht darin, die Runtime-Model-Ebene von Design-Pattern-Apps für Model-View-Controller zu erstellen. Persistenz ist eigentlich eine sekundäre und sogar optionale Funktion von Core Data.
Die wichtigsten Probleme bei der Modellierung / Persistenz sind die Größe der Daten und die Komplexität der Daten. Also würden die relativen Stärken und Schwächen jeder Art von Persistenz wie folgt zusammenbrechen:
%Vor%Zu denen wir eine dritte Dimension des Leasinggebers hinzufügen könnten, Volatilität, d. h. wie oft sich die Daten ändern
(1) Wenn die Größe, Komplexität und Flüchtigkeit der Daten gering sind, dann wird unter Verwendung einer Sammlung, z.B. NSArray, NSDictionary, NSSet eines serialisierten benutzerdefinierten Objekts wäre die beste Option. Sammlungen müssen vollständig in den Speicher gelesen werden, so dass ihre effektive Persistenzgröße begrenzt wird. Sie haben kein Komplexitätsmanagement und alle Änderungen erfordern das Neuschreiben der gesamten Persistenzdatei.
(2) Wenn die Größe sehr groß ist, aber die Komplexität gering ist, kann SQL oder eine andere Datenbank-API eine bessere Leistung erbringen. Z.B. ein altes Modebibliothek-Indexkartensystem. Jede Karte ist identisch, die Karten haben keine Beziehungen untereinander und die Karten haben kein Verhalten. SQL oder andere prozedurale DBs sind sehr gut in der Verarbeitung großer Mengen von Informationen geringer Komplexität. Wenn die Daten einfach sind, kann SQL selbst hochflüchtige Daten effizient verarbeiten. Wenn die Benutzeroberfläche genauso einfach ist, gibt es wenig Overhead bei der Integration der Benutzeroberfläche in das objektorientierte Design einer iOS / MacOS-App.
(3) Da die Daten komplexer werden, werden die Kerndaten schnell besser. Der "verwaltete" Teil von "verwalteten Objekten" verwaltet die Komplexität von Beziehungen und Verhaltensweisen. Mit Collections oder SQL haben Sie die Komplexität manuell verwaltet und sind schnell überfordert. Tatsächlich habe ich Leute gesehen, die versuchen, komplexe Daten mit SQL zu verwalten, die am Ende ihren eigenen Core Data Stack schreiben. Wenn Sie Komplexität mit Volatilität kombinieren, ist Core Data sogar noch besser, weil es die Nebenwirkungen von Einfügungen und Löschungen automatisch behandelt.
(Die Komplexität der Schnittstelle ist ebenfalls ein Problem. SQL kann eine große, statische singuläre Tabelle verarbeiten, aber wenn Sie Hierarchien von Tabellen hinzufügen, die sich im laufenden Betrieb ändern können, wird SQL zum Albtraum. Core Data, NSFetchedResultsController und UITableViewController / Delegierte machen es trivial.)
(4) Core Data ist mit hoher Komplexität und hoher Größe eindeutig die bessere Wahl. Core Data ist stark optimiert, so dass die Vergrößerung der Graphen die Dinge nicht so stark beeinträchtigt wie mit SQL. Sie erhalten auch hochintelligentes Caching.
Verwechseln Sie auch nicht: "Ich verstehe SQL gründlich, aber nicht Core Data", während "Core Data einen hohen Aufwand hat". Es tut es wirklich nicht. Selbst wenn Core Data nicht der kostengünstigste Weg ist, Daten in und aus der Persistenz zu bekommen, führt die Integration mit dem Rest der API in der Regel zu besseren Ergebnissen, wenn Sie Entwicklungsgeschwindigkeit und Zuverlässigkeit berücksichtigen.
In diesem speziellen Fall kann ich aus der Beschreibung nicht erkennen, ob Sie in Fall (2) oder Fall (4) sind. Dies hängt von der internen Komplexität der Daten UND der Komplexität der Benutzeroberfläche ab. Du sagst:
Ich glaube nicht, dass ich einen Core erstellen möchte Datenmodell mit 100 von Entitäten und Verwenden Sie dann einen Mapper, um den JSON zu importieren hinein.
Meinst du tatsächliche abstrakte Entitäten hier oder nur gemanagte Objekte? Denken Sie daran, Entitäten sind verwaltete Objekte, welche Klassen Instanzen sind. Wenn das erstere, dann ja Core Data wird viel Arbeit im Voraus, wenn das letztere, dann wird es nicht sein. Sie können sehr große komplexe Graphen mit nur zwei oder drei verwandten Entitäten erstellen.
Denken Sie auch daran, dass Sie die Konfiguration verwenden können, um verschiedene Entitäten in verschiedene Informationsspeicher zu stellen, auch wenn sie alle zur Laufzeit einen einzigen Kontext haben. Auf diese Weise können Sie temporäre Informationen in einem Geschäft speichern, sie als persistentere Daten verwenden und dann den Speicher löschen, wenn Sie damit fertig sind.
Core Data bietet Ihnen mehr Möglichkeiten als auf den ersten Blick ersichtlich ist.
Ich benutze SBJson , um JSON zu NSDictionaries zu analysieren und sie dann als .plist-Dateien mit [dict writeToFile:saveFilePath atomically:YES]
zu speichern. Das Laden ist auch genauso einfach NSMutableDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:saveFilePath]
. Es ist schnell, effizient und einfach. Keine Notwendigkeit für eine Datenbank.
JSON Framework ist eins. Dadurch wird Ihr JSON in native NSDictionary- und NSArray-Objekte umgewandelt. Ich weiß nichts über seine Leistung in einem großen Dokument, aber viele Leute benutzen es und mögen es. Es ist nicht die einzige JSON-Bibliothek für iOS, aber es ist eine beliebte.
Tags und Links iphone persistence json core-data store