JSON et Données de Base de l'iPhone
J'ai une base de données de l'objet graphique (composée de deux entités liées par une relation).
J'étais curieux, comme un relativement inexpérimentés développeur iPhone, si quelqu'un pourrait recommander une approche et une JSON mise en œuvre pour l'iPhone, qui me permettrait de:
-
convertir la base de données des enregistrements dans une chaîne JSON (tout en maintenant la relation entre les entités); et
-
convertir la chaîne JSON de retour dans la base de données des objets (de plus en préservant la relation entre les entités).
J'ai cherché, sans succès, pour un tutoriel/exemple de code sur ce point, de sorte que toute aide serait la bienvenue.
- Pour ceux qui cherchent dans ce pour iOS5, il y a maintenant
NSJSONSerialization
developer.apple.com/library/mac/#documentation/Foundation/... stackoverflow.com/questions/6726899/nsjsonserialization-in-ios5 - Je sais que cette question est un peu vieux, mais j'ai créé un simple bibliothèque appelée OSReflectionKit, qui vous permet de sérialiser/désérialiser des objets/à partir de JSON, à l'aide de NSJSONSerialization, ou de NSDictionary. Il prend également en charge de Base de Données objets.
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, choisir une librairie JSON à utiliser, personnellement, j'aime TouchJSON mais plusieurs autres sont très belles aussi. La partie compliquée, bien que pas très dur, est de convertir vos objets gérés en place des structures adéquates pour la conversion. J'ai écrit ça vite fait, donc il peut avoir une erreur ou deux 🙂
Les méthodes que vous appelez sont:
Et la mise en œuvre est comme suit:
Maintenant, c'est récursive de sorte que vous pouvez facilement traduire la totalité de votre magasin persistant si vous n'êtes pas prudent. Regarder vos relations et de s'assurer qu'ils ne vont "vers le bas" l'objet de l'arbre, de sorte que vous obtenez seulement les objets que vous souhaitez traduire.
for (NSString *relationshipName in [relationshipsByName allKeys])
peut être écrite commefor (NSString *relationshipName in relationshipsByName)
-setValuesForKeysWithDictionary:
dans une boucle qui itère sur les touches dans le dictionnaire et les appels-setValue: forKey:
pour chaque clé. Qui vous permettra de voir la clé est la question.[valuesDictionary setValue:[self dataStructureForManagedObject:]];
- je suis en train de travailler sur ce qu'il est censé être, des indices? Désolé si je suis d'épaisseur 🙁Je voulais juste faire remarquer une petite faute de frappe, ce qui a provoqué le code de crash, et j'espère que cela va vous faire économiser quelques min.
La
NSMutableArray *dataArray = [[NSArray alloc] init]; //This should be NSMutableArray
devrait vraiment être
NSMutableArray *dataArray = [[NSMutableArray alloc] init];
c'est tout.
merci
Synchronisation de Base de Données avec des Rails est une présentation détaillée qui inclut des exemples de code pour la sérialisation/désérialisation de votre Base de Données d'objets/de JSON (passez à la diapositive 55 pour la Base de Données). Son exemple de code suppose une assez simple modèle sans relations, même si je pense qu'il serait assez facile à étendre.
La présentation va également dans quelques détails au sujet de garder votre Cœur de modèle de Données en synchronisation avec un REPOS de l'application web, avec des liens vers certains des bibliothèques utiles, y compris ObjectiveResource et ASIHTTPRequest. Vous ne savez pas si c'est ce que vous êtes en train de faire, mais il vaut la peine de regarder, même pour la Base de Données de code.
Si vous avez un
NSDate
dans votre objet géré, comme mentionné ci-dessus dans l'un des commentaires, vous aurez des problèmes de la sérialisation de l'objet contenant leNSDate
. Une solution simple est d'ajouter unJSONDataRepresentation
méthode pourNSDate
en objective-c catégories.Ajouter ces fichiers à votre projet:
NSdate.h:
NSDate.m:
Il y a une lib qui fait le JSON de synchronisation pour vous : https://github.com/sixdegrees/lidenbrock
Je suis tombé sur ce post qui fonctionne très bien.
http://touchalicious.com/blog/2009/10/25/turn-core-data-models-into-json.html
Puisque c'est récursive, plusieurs-à-plusieurs liens allons faire une boucle par eux-mêmes. Pour éviter cela, j'ai ajouté un "isExportable" pour les infos sur l'utilisateur dictionnaire des relations dans ma Base de Données modèle. Vous pouvez ensuite vérifier cette clé et choisissez de ne pas en boucle par le biais de relations sans elle.
Juste pensé id poster une mise à jour rapide à cette question. J'ai suivi les Réponses par Marcus et Brandon et est venu avec cette JSON l'exportation (il utilise TouchJSON encore):
Je ne pouvais pas obtenir à l'importation de travail, peut être que cela a quelque chose à voir avec le fait que je suis en utilisant Magique Dossier je ne suis pas sûr, donc je suis juste en parcourant les entrants flux JSON et créer des objets à la main...
Marcus S. Zarra m'a inspiré pour amener le récursive idée d'une version de travail. Dans cette version, vous n'avez pas besoin de définir une clé de CoreData et vous pouvez couper et coller dans votre projet 🙂
La clé ici est de transmettre à l'entité mère comme argument de la récursivité, afin que nous puissions décider qui de la relation que nous avons à remplir avec des données. Donc les deux fonctions:
dataStructureFromManagedObject
etmanagedObjectFromStructure
peut encoder et de décoder toute entité objet de CoreData dans un dictionnaire et à l'arrière dans un objet.