Sauvegarde NSArray

mac_manumac_manu Membre
19:59 modifié dans API AppKit #1
Bonjour à  tous,

J'ai une petite question: Pour sauvegarder mes données de mon array, je procède actuellement via NSCoder et ses méthodes initWithCoder et encodeWithCoder. Est-il possible de sauvegarder mes données d'une autre façon, de manière à  pouvoir récupérer le fichier ainsi crée pour l'utiliser dans un doc Excel par exemple? Si oui, avez vous un petit ex. de code?

Merci et... à  bientôt. :adios!:

Réponses

  • cbrandtcbrandt Membre
    19:59 modifié #2
    bon, je crois que j'ai compris: ton dico contient un nsnumber et pas un nsbutton (contrairement à  ce que j'avais compris plus tôt).

    donc le datasource renvoie cet nsnumber à  la checkbox (dans tableView:objectValueForTableColumn:row:) ou en reçoit un quand on clique sur la checkbox (dans tableView:setObjectValue:forTableColumn:row:).

    donc en fait rien de magique, tu as réellement un nsnumber dans le dico, mais simplement la colonne correspondante du tableau affiche une checkbox...

    donc ta méthode est bonne...

    cqfd  :)
  • VeillardVeillard Membre
    19:59 modifié #3
    Salut mac_manu

    Tu peux sauvegarder en XML (le fichier peut être lu avec n'importe quel traitement de texte).

    - (BOOL)writeToFile:(NSString*)aPath ofType:(NSString*)type<br />{<br />	return [myArray writeToFile:aPath atomically:YES];<br />}<br /><br />- (BOOL)readFromFile:(NSString*)aPath ofType:(NSString*)type<br />{<br />	[myArray autorelease];<br />	myArray = [[NSArray alloc] initWithContentsOfFile:(NSString *)aPath];<br />	return YES;<br />}<br />
    


  • mac_manumac_manu Membre
    19:59 modifié #4
    Merci Fafouille, je vais de ce pas m'y atteler... :spot:
  • mac_manumac_manu Membre
    19:59 modifié #5
    Aà¯e, ça ne marche pas... Je dois certainement ommettre qqc. Ce qui m'étonne, c'est  writeToFile concerne normalement les NSString, et non les array. De plus, que dois-je mettre dans la variable type? @XML ? ou autre chose?  :crackboom:-
  • VeillardVeillard Membre
    19:59 modifié #6
    En ce qui me concerne, ca marche.  ;D J'ai un Array contenant plusieurs Dictionary, ils peuvent aussi bien contenir d'autres Array.
    As-tu initialisé ton array ?

    - (id)init<br />{<br />&nbsp; &nbsp; self = [super init];<br />&nbsp; &nbsp; if (self)<br />	{<br />		myArray = [[NSMutableArray alloc] init];<br />	}<br />&nbsp; &nbsp; return self;<br />}<br /><br />- (void) dealloc<br />{<br />	[myArray release];<br />}<br /><br />
    


    myArray doit correspondre à  l'objet root de ton fichier (visible avec PropertyList Editor)
  • ClicCoolClicCool Membre
    19:59 modifié #7
    dans 1101633802:

    Aà¯e, ça ne marche pas... Je dois certainement ommettre qqc. Ce qui m'étonne, c'est  writeToFile concerne normalement les NSString, et non les array. De plus, que dois-je mettre dans la variable type? @XML ? ou autre chose?  :crackboom:-


    writeToFile: atomicaly: comme d'autres méthodes de lecture/écriture XML est une méthode implémentée autant par NSArray que d'autres property list objects comme les NSStrings et les NSDictionary.

    La variable type doit normalement contenir le type que tu as définit comme celui des fichiers que ton appli peut lire. Si tu veux rester lisible de façon transparente par tout éditeur xml tu peut tout simplement y mettre @plist.
  • mac_manumac_manu Membre
    19:59 modifié #8
    Est-ce que cela marche aussi si mon array contient des données autres que des NSDictionnary ou NSString, par ex. des float et des BOOL?
  • muqaddarmuqaddar Administrateur
    19:59 modifié #9
    Pas de soucis. On peut mettre des BOOL.
    Pour les float, tu peux les mettre dans un NSNumber je pense.
  • cbrandtcbrandt Membre
    19:59 modifié #10
    il me semble que ton array ne peut contenir que des NSData, NSDate, NSNumber, NS(Mutable)String, NS(Mutable)Array, ou NS(Mutable)Dictionary...
  • muqaddarmuqaddar Administrateur
    19:59 modifié #11
    et des Bool ! ;)

    qui seront :

    <key>Bool</key>
    <true/>

    ou

    <key>Bool</key>
    <false/>

    dans le plist.
  • cbrandtcbrandt Membre
    19:59 modifié #12
    ben, les bool sont des [nsnumber: numberwithbool], non ? ???
    de même pour les int, float, double... :)
  • Eddy58Eddy58 Membre
    19:59 modifié #13
    Pour mettre des valeurs dans des collections, il faut utiliser des objets de classe ou sous-classe NSValue (NSValue, NSNumber, NSDecimalNumber) :)
  • muqaddarmuqaddar Administrateur
    19:59 modifié #14
    dans 1101726224:

    ben, les bool sont des [nsnumber: numberwithbool], non ? ???
    de même pour les int, float, double... :)


    Bein pour les Bool, moi j'ai simplement fait :
    [tempDict setObject: [dict objectForKey:@paysBool] forKey:@paysBool];
    puis mon writeToFile,

    et là , ma clé étant une checkbox, ça sauvegarde avec true ou false.
  • cbrandtcbrandt Membre
    19:59 modifié #15
    uh ? @paysBool est un NSString, non ? ??? pas une checkbox ?
    ou alors j'ai loupé quelque chose .... :)

    ou plutôt, ton object dans le dico "dict", pour la clé @paysbool, est une checkbox... c'est ça ? et dans ce cas, il se pourrait que le writeToFile demande une valeur à  chacun des objets, et ton checkbox renvoie un nsnumber avec un bool... ?
  • mpergandmpergand Membre
    19:59 modifié #16

    [tempDict setObject: [dict objectForKey:@paysBool] forKey:@paysBool];


    Décidement l'objectiveC ça me laissera toujours perplexe, c'est pas un langage ça, c'est de la magie noire :D ( de plus, à  mon avis dans 15 jours tu comprends même plus ce que t'a voulu faire !)
  • muqaddarmuqaddar Administrateur
    19:59 modifié #17
    dans 1101733350:

    ou plutôt, ton object dans le dico "dict", pour la clé @paysbool, est une checkbox... c'est ça ?


    Oui, c'est ça. paysBool est l'identifier de colonne et la clé du dico. Dans les cellules, on a les checkbox et apparemment, il convertit tout seul en Bool !

    <br />	while (dict = [enumerator nextObject]) {<br />		NSMutableDictionary *tempDict = [NSMutableDictionary dictionary];<br />		[tempDict setObject: [dict objectForKey:@&quot;paysId&quot;] forKey:@&quot;paysId&quot;];<br />		[tempDict setObject: [dict objectForKey:@&quot;paysBool&quot;] forKey:@&quot;paysBool&quot;];<br />		[paysSaveArray addObject: tempDict];<br />	}<br />	[paysSaveArray writeToFile: paysPrefsFile atomically:YES];
    


    Ce code m'écrit bien </true> ou </false> pour ma clé paysBool, je confirme.
  • cbrandtcbrandt Membre
    19:59 modifié #18
    c'est quand même bien fait, hein ?  ;D
  • muqaddarmuqaddar Administrateur
    19:59 modifié #19
    En fait, j'ai pas saisi. Vous pensez que j'aurai dû faire autrement par sécurité (que c'est un miracle que ça marche) ou que j'ai raison d'en profiter ???
  • mpergandmpergand Membre
    19:59 modifié #20
    Ben en fait, si je comprends bien ( j'ai du mal à  suivre là  :o) ça transforme rien du tout, l'objet que tu récupères c'est pas un checkbox, mais l'etat de celui-ci, que même que c'est toi qui a dû le faire dans setObjectValue dans ton dataSource ;D

    En fait c'est de la prestidigitation :D ;D
  • muqaddarmuqaddar Administrateur
    19:59 modifié #21
    Je procède la même façon pour envoyer le bool à  la checkBox :

    [tempDict setObject: [dict objectForKey:@paysBool] forKey:@paysBool];

    Et ça me coche bien les bonnes cases... ;)
  • mpergandmpergand Membre
    19:59 modifié #22
    Mais pour fixer cette valeur boolèenne, tu dois bien faire quelque part un truc du genre:
    [monDico setObject: [NSNumber numberWithBool: etatDuCheckBox] forKey:@paysBool]

  • muqaddarmuqaddar Administrateur
    19:59 modifié #23
    Et bien non, même pas besoin !
    C'est magique. :-)
    Juste : [tempDict setObject: [dict objectForKey:@paysBool] forKey:@paysBool];
    Et comme ma colonne est une colonne de checkbox, il comprend tout seul.
  • mpergandmpergand Membre
    19:59 modifié #24
    Oui c'est ça cbrant,

    Dans le dataSource pour setObjectValue , anObject est du type NSNumber pour un NSButtonCell ( correspondant à  [buttonCell intValue] ) et effectivement c'est transparent :D
    (ma suis gourer, j'croyais que anObject était du type NSButtonCell ;) )
Connectez-vous ou Inscrivez-vous pour répondre.