Sauvegarder des données
Bonjour,
Mon application récupère un flux JSON grâce à NSURLConnection mais j'aimerais sauvegarder ces données dans l'iPhone pour y avoir accès en mode hors-connexion. Cela est-il possible ? Et si oui, comment ?
Merci d'avance
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il suffit d'utiliser les possibilités de serialisation des classes cocoa. Par exemple si ton JSON est récupéré sous forme d'une NSString à la base, il suffit d'utiliser la méthode
Après si le JSON est extrait de manière plus complexe (NSArray, NSDictionary, etc), il suffit d'utiliser les méthodes équivalentes pour l'écriture sur disque.
1) Soit tu stockes la chaà®ne JSON dans un fichier. C'est peut-être la solution la plus simple, mais qui a l'inconvénient de devoir reparser le JSON à chaque fois pour recréer tes objets métier. Pour ça utiliser "writeToFile:atomically:encoding" comme préconisé par Mala
2) Soit tu parses d'abord ta chaà®ne JSON sous forme d'un NSDictionary ou NSArray, à l'aide de NSJSONSerialization, et tu stockes le NSDictionary ou le NSArray obtenu dans un fichier. Pour ça, utiliser les méthodes équivalentes "writeToFile:atomically:error:" de la classe NSDictionary ou NSArray, comme indiqué également par Mala. Voire passer par NSPropertyListSerialization pour sérialiser ta structure dans un fichier PLIST.
---
Après, une fois que tu as parsé ta chaà®ne JSON sous forme d'un NSDicitonary ou NSArray avec NSJSONSerialization, tu as peut-être ensuite prévu dans ton application une abstraction supplémentaire pour ton modèle ? Autrement dit, après avoir parsé ton JSON tu as peut-être prévu de le convertir en des objets métier dédiés, comme par exemple créer des classes persos TFBlogArticle, TFBlogCategory, etc... que tu auras créées et qui contiendront des @property adéquates comme "title", "url", etc... et lorsque tu auras parsé ton JSON, l'idée serait alors de créer des objets TFBlogArticle et de les remplir d'après les données dudit JSON.
C'est une approche / architecture qui est conseillée, car ça te permet ensuite dans ton application de manipuler des objets modèle dédiées comme des TFBlogArticles directement, et d'accéder à leurs propriétés, plutôt que de fonctionner avec des dictionnaires et d'avoir à connaà®tre le nom de chaque clés, etc.
Si tu as un tel modèle (et encore une fois je le conseille, d'autant que cela permet d'encore mieux respecter le Design Pattern MVC, et au final c'est une architecture assez standard en POO qui n'est pas forcément propre à Cocoa et c'est une pratique que tu as sans doute dû apprendre/pratiquer en Java aussi), alors plutôt que de stocker la chaà®ne JSON dans un fichier (et devoir la reparser à chaque fois en NSArray de NSDictionary, puis en objets métier TFBlogArticle), ou encore de stoker le JSON parsé sous forme de NSArray de NSDictionary dans un PLIST (et d'avoir à recréer tes objets métier TFBlogArticle ensuite à chaque relecture du PLIST), tu peux :
- Soit utiliser CoreData (tes objets TFBlogArticles seront alors non pas des simples NSObject mais plutôt des NSManagedObject, qui seront stockés et générés automatiquement par CoreData, qui gère pour toi toute la pérennisation de ces objets en base de données)
- Soit si tu ne veux pas utiliser CoreData, tes classes TFBlogArticle ne seront que de simples NSObject du coup, mais si tu leur fait implémenter le @protocol <NSCoding> cela te permettra de les sérialiser avec NSArchiver/NSCoder.
---* Pour plus d'infos sur ces possibilités, lire le Archives and Serialization Programming Guide.
* Pour plus d'infos sur CoreData, rechercher "CoreData" sur le forum, on a un paquet de sujets dans lesquels on en parle, dont la présentation aux CocoaHeads Rennes présentant MagicalRecord ou comment rentrer dans CoreData rapidement sans risquer d'être effrayé par ce framework assez conséquent.
Un poète du clavier notre Ali!!!
Merci beaucoup encore une fois AliGator pour toutes ces explications !
Merci à Mala aussi
Et donc si je veux utiliser CoreData pour stocker des objets Articles, par exemple, vous n'avez pas des liens pour m'aider ?
Ah oui effectivement, merci !
Ah et dernière chose, pour récupérer le contenu du fichier PLIST crée avec NSPropertyListSerialization, c'est comme ça ?
Non, -[dictionaryWithContentsOfFile:] attend le chemin du fichier en paramètre.
Et par ailleurs, si ARC est activé, on ne peut pas appeler -retain.
Mais bon honnêtement vu toutes les questions que tu sembles avoir, ça vaudrait vraiment le coup de t'acheter un bon bouquin pour apprendre à développer sur iOS : tu y apprendrais plein de trucs, avec des chapitres dédiés à ce genre de problématiques classiques, où ils expliquent en détail les concepts et tout.
Ou alors, tu te tapes tous les Programming Guides d'Apple (la doc Apple est l'une des plus riches que je connaisse) qui expliquent aussi chaque sujet de façon détaillée.
Sinon tu vas pas arrêter de te poser des questions à chaque ligne de code que tu veux écrire ou chaque truc que tu veux faire et tu ne vas pas avancer très vite dans ton apprentissage
Merci beaucoup pour tous ces conseils !
J'ai un livre chez moi comme indiqué dans ma présentation mais j'étais en vacances et (comme un idiot) j'ai oublié de le prendre. Faudrait que je me mette à le lire
T'as bien fais de l'oublier