[résolu] Technique simple pour conserver un objet

mybofymybofy Membre
octobre 2013 modifié dans API AppKit #1

Bonjour.


 


Lorsque je lance mon application pour la première fois, j'initialise un objet, par exemple un tableau contenant les paramètres de connexion à  une base de données distante. Je ne peux pas les mettre en dur dans le code, puisque je ne connais pas ceux que voudra utiliser celui qui lance mon application.


Lorsque je lance mon application ensuite je voudrais récupérer mon tableau  de paramètres et ne pas avoir à  entrer de nouveau ces paramètres.


Autrement dit comment assurer la permanence des données de mon tableau une fois l'application fermée, afin


de pouvoir utiliser ces données lors d'un nouveau lancement de l'application.


Quelle serait la technique la plus simple ?


J'ai vu Core Data, sqlite. Il y en a certainement d'autres, moins sophistiquées.


Sinon, j'envoie les données sur mon serveur PostgreSQL et je les rapatrie au besoin. Cela je sais le faire facilement. Mais c'est un marteau-pilon pour écraser une noix...


 


Merci de vos suggestions


 


 


 


 


Réponses

  • MalaMala Membre, Modérateur

    Regardes la doc de NSUserDefaults ;)


  • Je confirme, Core Data c'est vraiment trop sophistiqué pour çà . Et NSUserDefaults est fait pour çà  en plus.


     


    En plus de la doc, fais une recherche sur le forum, tu as des tas de posts à  ce sujet...


     


    Ici et ici entre autres...


  • Je me suis mal fait comprendre.


     


    Il ne s'agit pas de conserver un objet "MesParms" le temps que l'application "MonApp" est active.


    Pour cela NSUserDefaults est parfait.


    Mais à  chaque nouveau lancement de "MonApp", NSUserDefaults est réinitialisé à  nil. Les valeurs


    de l'objet "MesParms" sont réinitialisées idem et donc perdues d'un lancement à  l'autre.


    Je viens d'en faire l'essai.



    NSUserDefaults *keep = [NSUserDefaults standardUserDefaults];
    [keep setObject:nil forKey:@karray];
    NSLog(@[;keep objectForKey:@karray].0 : %@", [keep objectForKey:@karray]);
    if ([keep objectForKey:@karray] == nil) {
    NSLog(@[;keep objectForKey:@karray].1 : %@", [keep objectForKey:@karray]);
    NSArray *array = @[;@essai];
    [keep setObject:array forKey:@karray];
    NSLog(@[;keep objectForKey:@karray].2 : %@", [keep objectForKey:@karray]);
    } else {
    NSLog(@[;keep objectForKey:@karray].X : %@", [keep objectForKey:@karray]);
    }


    Premier lancement



    2013-10-07 15:00:40.602 Herbier[1985:603] [keep objectForKey:@karray].0 : (null)
    2013-10-07 15:00:40.603 Herbier[1985:603] [keep objectForKey:@karray].1 : (null)
    2013-10-07 15:00:40.603 Herbier[1985:603] [keep objectForKey:@karray].2 : (
    essai
    )
     

    Second lancement



    2013-10-07 15:00:40.602 Herbier[1985:603] [keep objectForKey:@karray].0 : (null)
    2013-10-07 15:00:40.603 Herbier[1985:603] [keep objectForKey:@karray].1 : (null)
    2013-10-07 15:00:40.603 Herbier[1985:603] [keep objectForKey:@karray].2 : (
    essai
    )
     

    J'aurais souhaité voir



    2013-10-07 15:00:40.603 Herbier[1985:603] [keep objectForKey:@karray].X : (
    essai
    )
     

    Bon je me suis peut-être trompé dans le code ?


     


    Ce que je voudrais.


    Premier lancement de "MonApp",  la variable d'instance "user" de "MesParms" est égale à  @"". Je lui donne une valeur @toto. Je veux conserver un objet "truc" de valeur @toto quelque part, hors de l'application sans doute.


    Lors d'un lancement ultérieur de "MonApp", je veux pouvoir récupérer la valeur  @toto de l'objet "truc" et l'utiliser via un "setUser:truc" par exemple.


     


    Je voudrais une sorte de NSUserDefaults qui persiste une fois l'application fermée.


     


     


     


     


     


  • AliGatorAliGator Membre, Modérateur
    octobre 2013 modifié #5

    Mais à  chaque nouveau lancement de "MonApp", NSUserDefaults est réinitialisé à  nil.
    (...)
    Je voudrais une sorte de NSUserDefaults qui persiste une fois l'application fermée.


    Heu non c'est ton code qui est mauvais. NSUserDefaults est justement fait pour persister une fois l'application fermé, il n'est certainement pas réinitialisé à  nil.

    Et c'est un peu normal le comportement que tu as, vu ton code... vu que dès la 2eme ligne tu effaces la valeur de karray, et ensuite tu t'étonnes que dès la 3ème ligne sa valeur soit effacée...

    Pourquoi remettre karray à  nil à  chaque lancement ? Forcément si tu l'effaces explicitement à  chaque fois, bah en effet il sera effacé puisque c'est ce que tu demandes via ta ligne de code!!

     

    J'aurais souhaité voir

    2013-10-07 15:00:40.603 Herbier[1985:603] [keep objectForKey:@karray].X : (
    essai
    )

    Enlève ta 2e ligne de code inutile et c'est précisément le comportement que tu auras.


  • Mais à  chaque nouveau lancement de "MonApp", NSUserDefaults est réinitialisé à  nil. 




     


    Non le NSUserDefaults n'est pas réinitialisé a nil a chaque lancement de l'application ( Comme précisé par @AliGator c'est ton code qui n'est pas bon), le NSUserDefaults est réinitialisé seulement si tu supprime l'application et tu la réinstalle. Si tu veux garder la valeur même si l'application est désinstaller, il faut la garder dans le trousseau ( je ne suis pas trop sur :)).

  • Bah, en plus dans les liens que je t'ai donné, si tu les as lus, il y a des bouts de code dedans... Il te suffit de les adapter à  ton cas.


  • Mais c'est bien sûr ! Erreur classique ...


     


    J'avais regardé NSUserDefaults sans en comprendre l'intérêt, la persistance d'un lancement à  l'autre.


    Mais c'est bien caché dans la doc, du moins je ne l'ai pas vu.


     


    Question bête : si je lance plusieurs fois la même application en même temps, que se passe-t-il ?


     


    Merci à  tous.


  • AliGatorAliGator Membre, Modérateur
    Par défaut tu ne peux pas lancer plusieurs instances d'une même application sous OSX. Du moins pas en double-cliquant dessus. LaunchServices ne fait qu'activer l'instance déjà  lancée le cas échéant.

    Donc déjà  c'est un cas très rare voire qui n'arrive jamais d'avoir plusieurs instances de ton application de lancée. Sauf sur du multi-session (plusieurs comptes utilisateurs). Mais de toute façon NSUserDefaults est organisé en domaines. D'ailleurs ce concept est expliqué dès la première page du Programming Guide associé, donc je te laisse RTFM puisque tout est expliqué dans ce Programming Guide mieux que je ne saurai le faire moi-même.
Connectez-vous ou Inscrivez-vous pour répondre.