Ich habe einen Kerndatenobjektgraphen (bestehend aus zwei Entitäten, die durch eine zu viele Beziehung verbunden sind).
Als relativ unerfahrener iPhone-Entwickler war ich neugierig, ob jemand einen Ansatz und eine geeignete JSON-Implementierung für das iPhone empfehlen könnte, die es mir ermöglichen würde:
Konvertieren der Kerndatensätze in eine JSON-Zeichenfolge (unter Beibehaltung der Beziehung zwischen den Entitäten); und
Konvertieren Sie die JSON-Zeichenfolge zurück in Kerndatenobjekte (wobei die Beziehung zwischen Entitäten beibehalten wird).
Ich habe erfolglos nach einem Tutorial / Codebeispiel zu diesem Punkt gesucht, damit jede Unterstützung dankbar erhalten wird.
iphone
objective-c
json
core-data
Urizen
quelle
quelle
NSJSONSerialization
developer.apple.com/library/mac/#documentation/Foundation/… stackoverflow.com/questions/6726899/nsjsonserialization-in-ios5Antworten:
Wählen Sie zunächst eine JSON-Bibliothek aus, die ich verwenden möchte. Ich persönlich mag TouchJSON, aber einige andere sind auch sehr nett. Der komplizierte Teil ist zwar nicht sehr schwierig, besteht jedoch darin, Ihre verwalteten Objekte in geeignete Strukturen für die Konvertierung zu konvertieren. Ich habe das ganz schnell geschrieben, damit es ein oder zwei Fehler gibt :)
Die Methoden, die Sie aufrufen, sind:
Und die Implementierung ist wie folgt:
Dies ist jetzt rekursiv, sodass Sie leicht Ihren gesamten persistenten Speicher übersetzen können, wenn Sie nicht vorsichtig sind. Beobachten Sie Ihre Beziehungen und stellen Sie sicher, dass sie nur den Objektbaum "runter" gehen, damit Sie nur die Objekte erhalten, die Sie übersetzen möchten.
quelle
Ich wollte nur auf einen kleinen Tippfehler hinweisen, der zum Absturz des Codes führte, und hoffentlich sparen Sie dadurch ein paar Minuten.
Das
NSMutableArray *dataArray = [[NSArray alloc] init]; // This should be NSMutableArray
sollte wirklich sein
NSMutableArray *dataArray = [[NSMutableArray alloc] init];
das ist alles.
Danke
quelle
Das Synchronisieren von Core-Daten mit Rails ist eine detaillierte Präsentation, die Beispielcode zum Serialisieren / Deserialisieren Ihrer Core-Data-Objekte zu / von JSON enthält (fahren Sie mit Folie 55 für den Core-Data-Teil fort). Sein Beispielcode geht von einem ziemlich einfachen Modell ohne Beziehungen aus, obwohl ich denke, dass es ziemlich einfach zu erweitern wäre.
In der Präsentation wird auch detailliert beschrieben, wie Sie Ihr Core Data-Modell mit einer REST-basierten Webanwendung synchronisieren und auf einige nützliche Bibliotheken verweisen können , darunter ObjectiveResource und ASIHTTPRequest . Ich bin mir nicht sicher, ob Sie das versuchen, aber es lohnt sich, auch nach dem Core Data-Code zu suchen.
quelle
Wenn Sie ein
NSDate
in Ihrem verwalteten Objekt haben, wie oben in einem der Kommentare erwähnt, haben Sie Probleme beim Serialisieren des Objekts, das das enthältNSDate
. Eine einfache Lösung besteht darin, eineJSONDataRepresentation
Methode zurNSDate
Verwendung von Ziel-C-Kategorien hinzuzufügen .Fügen Sie Ihrem Projekt diese beiden Dateien hinzu:
NSdate.h:
NSDate.m:
quelle
Es gibt eine Bibliothek, die die JSON-Synchronisierung für Sie ausführt : https://github.com/sixdegrees/lidenbrock
quelle
Ich bin auf diesen Beitrag gestoßen, der sehr gut funktioniert.
http://touchalicious.com/blog/2009/10/25/turn-core-data-models-into-json.html
Da dies rekursiv ist, werden sich viele-zu-viele-Beziehungen immer wieder selbst durchlaufen. Um dies zu vermeiden, habe ich dem Benutzerinformationswörterbuch der Beziehungen in meinem Kerndatenmodell einen "isExportable" -Schlüssel hinzugefügt. Sie können dann nach diesem Schlüssel suchen und festlegen, dass Beziehungen ohne ihn nicht durchlaufen werden.
quelle
Ich dachte nur, ich poste ein schnelles Update zu dieser Frage. Ich folgte den Antworten von Marcus und Brandon und fand diese für den JSON-Export (es wird immer noch TouchJSON verwendet):
Ich konnte den Import nicht zum Laufen bringen, vielleicht hat das etwas damit zu tun, dass ich Magical Record verwende. Ich bin mir nicht sicher, also durchlaufe ich einfach den eingehenden JSON-Stream und erstelle Objekte manuell ...
quelle
Marcus S. Zarra hat mich inspiriert, die rekursive Idee in eine funktionierende Version zu bringen. In dieser Version müssen Sie keinen Schlüssel in CoreData festlegen und können ihn ausschneiden und in Ihr Projekt einfügen :-)
Der Schlüssel hier ist, die übergeordnete Entität als Argument an die Rekursion zu übergeben, damit wir entscheiden können, welche Beziehung wir mit Daten füllen müssen. Also die beiden Funktionen:
dataStructureFromManagedObject
undmanagedObjectFromStructure
können jedes Entitätsobjekt von CoreData in ein Wörterbuch und zurück in ein Objekt codieren und decodieren.quelle