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 :)


Réponses

  • MalaMala Membre, Modérateur

    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



    - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error

    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.


  • AliGatorAliGator Membre, Modérateur
    avril 2014 modifié #3
    En fait tu as un sacré paquet de solutions.

    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:error:" 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.
  • MalaMala Membre, Modérateur

    Un poète du clavier notre Ali!!! 


      :p   :p   :p   :p


  • 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 ?


  • AliGatorAliGator Membre, Modérateur
    Bah si j'ai dit en bas de mon message où trouver plus d'infos. Recherche sur le forum (car c'est un sujet qu'on a trèèès souvent abordé) et session CocoaHeads.
  • 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 ?



    self.fichier = [[NSString alloc] initWithString:[emplacement stringByAppendingFormat:@nom.plist]];
     
    //On va lire le fichier de stockage
    NSDictionary donneeStocke = [NSDictionary dictionaryWithContentsOfFile:self.fichier];
    [donneeStocke retain];
  • CéroceCéroce Membre, Modérateur

    Non, -[dictionaryWithContentsOfFile:] attend le chemin du fichier en paramètre.


     


    Et par ailleurs, si ARC est activé, on ne peut pas appeler -retain.


  • AliGatorAliGator Membre, Modérateur
    Pour avoir le chemin d'un fichier se trouvant dans tes ressources, [[NSBundle mainBundle] pathForResource:ofType:]

    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 ;)


  • samirsamir Membre
    avril 2014 modifié #12


    j'étais en vacances et (comme un idiot) j'ai oublié de le prendre...




    T'as bien fais de l'oublier :)


Connectez-vous ou Inscrivez-vous pour répondre.