Créer un fichier plist avec du code ?

apocaalypsoapocaalypso Membre
02:03 modifié dans API AppKit #1
Bonjour,

je souhaiterai pouvoir créer un fichier .plist dans le bundle des ressources avec du code mais je ne sais pas vraiment comment m'y prendre, j'ai d'abord cherché sur Internet mais je n'ai pas trouvé de lien utile.

Merci !

Réponses

  • Philippe49Philippe49 Membre
    02:03 modifié #2
    Méthodes writeToFile:atomically: de NSArray ou NSDictionary ...
  • AliGatorAliGator Membre, Modérateur
    juillet 2009 modifié #3
    Oui comme l'a dit Philippe49 pour la creation du plist par contre tu ne pourras pas le sauvegarder dans les ressources du bundle des ressources de ton appli car ce dernier n'est pas voué à  être modifié une fois l'appli compilée.

    Si tu fais créer un plist par ton appli soit tu demandes à  l'utilisateur l'emplacement où sauver le plist, soit tu le sauves dans un endroit type réservé à  ton appli, typiquement dans un dossier portant le nom de ton appli dans le dossier ~/Library/Application Support.

    Enfin bon pour les tests tu peux déjà  mettre ton plist sur le bureau et vérifier que ça marche mais à  terme faudra le mettre dans une endroit "propre".
  • GreensourceGreensource Membre
    02:03 modifié #4
    dans 1247615272:

    ...tu ne pourras pas le sauvegarder dans les ressources du bundle des ressources de ton appli car ce dernier n'est pas voué à  être modifié une fois l'appli compilée.

    Ca signifie que ce n'est pas possible ou bien que ce n'est pas la philosophie d'un bundle? Parce qu'à  priori on a accès à  ce qu'il contient non? Puisqu'on peut le faire à  la mano via le finder.
  • Philippe49Philippe49 Membre
    02:03 modifié #5
    Dans les principes généraux de la programmation iPhone, on a accès au(x) bundle(s) au moment de la compilation, pas au moment de l'exécution.
    Par contre on peut tout à  fait écrire et lire dans le "sand box" de l'application qui se présente sous la forme suivante :
  • apocaalypsoapocaalypso Membre
    02:03 modifié #6
    D'accord, je vais donc essayer de les créer dans Application Support.
    Mais je ne m'en sort pas du tout avec mon code :
    NSString *title = [title stringValue];<br />	NSString *fileName = [title stringByAppendingString:@&quot;.txt&quot;];<br />	<br />	NSString *pathR = [@&quot;~/Library/Application Support/App/&quot; stringByAppendingString:fileName];<br />	NSString *path = [pathR stringByExpandingTildeInPath];<br />	<br />	[NSDictionary writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
    

    J'essaye uniquement de créer un .txt pour l'instant parce que déjà  que j'ai du mal. Il me dit que NSDictionnary may not respond, et il n'y a rien de bien sur Internet.
  • Philippe49Philippe49 Membre
    02:03 modifié #7
    writeToFile: atomically: est précédée d'un moins "-", ce n'est donc pas une méthode de classe, mais une méthode d'instance.
    NSDictionary * dico=.....
    [dico writeToFile:path atomically:YES];
  • apocaalypsoapocaalypso Membre
    02:03 modifié #8
    Parce qu'en fait mon app gère des "ensembles" et il y aurais donc un plist pour chaque ensemble que l'utilisateur créé.
    Je pense que finalement se serait plus pratique de passer par SQLite non ? Si il est disponible sur Mac OS X.
  • Philippe49Philippe49 Membre
    02:03 modifié #9
    dans 1247662980:

    Parce qu'en fait mon app gère des "ensembles" et il y aurais donc un plist pour chaque ensemble que l'utilisateur créé.
    Je pense que finalement se serait plus pratique de passer par SQLite non ? Si il est disponible sur Mac OS X.

    Non, pas plus simple. Si tu gères des ensembles, donc des NSSet (c'est bien ce que tu veux dire ?), il faut les transformer en NSArray avant d'utiliser writeToFile: atomically:
  • apocaalypsoapocaalypso Membre
    02:03 modifié #10
    Quand je parle d'ensemble c'est des projets, c'est à  dire que mon plist doit contenir le nom du créateur, la description du truc, la date, etc...
  • Philippe49Philippe49 Membre
    02:03 modifié #11
    Alors ce sont bien des NSArray de NSDictionary qu'il faut utiliser :

    NSDictionary * dico1=[NSDIctionary dictionaryWithObjectsAndKeys:
              @Toto,@Createur,
              @Fait la mayonnaise,@Description,
              [NSDate date],@Date,
              nil
    ];
    ...
    NSArray * array=[NSArray arrayWithObjects:dico1,dico2,...,nil];
    [array writeToFile:@chemin atomically:YES];
  • apocaalypsoapocaalypso Membre
    02:03 modifié #12
    Merci Philippe, voici ce que j'ai obtenu grâce à  ton aide :
    NSString *path = @&quot;~/Library/Application Support/Billto/prout.plist&quot;;<br />	NSString *realPath = [path stringByExpandingTildeInPath];<br />	NSDictionary *dico1 = [NSDictionary dictionaryWithObjectsAndKeys:<br />						&nbsp; @&quot;Toto&quot;, @&quot;Createur&quot;,<br />						&nbsp; @&quot;Fait la mayonnaise&quot;, @&quot;Description&quot;,<br />						&nbsp; [NSDate date], @&quot;Date&quot;,<br />						&nbsp; nil<br />	];<br />	NSArray * array = [NSArray arrayWithObjects:dico1, nil];<br />&nbsp; &nbsp; &nbsp; &nbsp; [array writeToFile:realPath atomically:YES];<br />
    


    Mais lorsque je regarde dans Application Support il ne m'a pas créer le fichier, le [array writeToFile:realPath atomically:YES] retourne NO apparemment.
  • Philippe49Philippe49 Membre
    02:03 modifié #13
    C'est ton chemin d'accès qui est incorrect. Une recherche sur ce (merveilleux) site t'aurait fourni la réponse car on a déjà  répondu plusieurs fois à  ce sujet.

    Allez, un peu de lecture
  • tabliertablier Membre
    02:03 modifié #14
    Dans les principes généraux de la programmation iPhone, on a accès au(x) bundle(s) au moment de la compilation, pas au moment de l'exécution.
      :P Oui, mais ici nous sommes dans la section Mac, pas iPhone.
    Qu'est ce qui empêche une application de créer un fichier .plist (ou autre) dans son propre bundle? rien j'ai l'impression.
  • Philippe49Philippe49 Membre
    juillet 2009 modifié #15
    Oups, merci Tablier de ton coup d'oe“il ! 
    On n'a pas l'habitude de voir Apocaalypso sur le Mac alors  ...

    Bon mais ton code ne pose aucun problème ...
    <br />#import &lt;Foundation/Foundation.h&gt;<br />int main (int argc, const char * argv&#91;]) {<br />	NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];<br />	NSString *path = @&quot;~/Desktop/prout.plist&quot;;<br />	NSString *realPath = [path stringByExpandingTildeInPath];<br />	NSDictionary *dico1 = [NSDictionary dictionaryWithObjectsAndKeys:<br />			@&quot;Toto&quot;, @&quot;Createur&quot;,<br />			@&quot;Fait la mayonnaise&quot;, @&quot;Description&quot;,<br />			[NSDate date], @&quot;Date&quot;,<br />			nil<br />	];<br />	NSArray * array = [NSArray arrayWithObjects:dico1, nil];<br />	[array writeToFile:realPath atomically:YES];<br />	[pool drain];<br />	return 0;<br />}
    



    % gcc pgm.m -o pgm -framework Foundation
    % pgm
    % cat prout.plist
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">;
    <plist version="1.0">
    <array>
    <dict>
    <key>Createur</key>
    <string>Toto</string>
    <key>Date</key>
    <date>2009-07-15T20:10:08Z</date>
    <key>Description</key>
    <string>Fait la mayonnaise</string>
    </dict>
    </array>
    </plist>
    %
  • 02:03 modifié #16
    Le dossier Billto existe?  :o ;D
  • apocaalypsoapocaalypso Membre
    02:03 modifié #17
    Oui c'est ça le problème, il n'existe pas.
    Donc je vérifie s'il existe et sinon je tente de le créer via AppleScript (je n'ai pas réussi à  trouver comment le faire en Objective-C) mais ça ne marche pas, pourtant ce même script fonctionne dans l'Editeur de Script :
    NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@&quot;set user to do shell script &#092;&quot;whoami&#092;&quot; tell application &#092;&quot;Finder&#092;&quot; make new folder at folder &#092;&quot;Application Support&#092;&quot; of folder &#092;&quot;Library&#092;&quot; of folder user of folder &#092;&quot;Users&#092;&quot; of startup disk with properties {name:&#092;&quot;MonDossier&#092;&quot;}&quot;];<br />		[script executeAndReturnError:nil];<br />		[script release];<br />
    
  • tabliertablier Membre
    juillet 2009 modifié #18
  • apocaalypsoapocaalypso Membre
    02:03 modifié #19
    Merci Tablier !
  • apocaalypsoapocaalypso Membre
    02:03 modifié #20
    Me revoilà  avec un autre problè...  :o
    Cette fois-ci c'est pour lire mon plist, voici mon code :
    NSString *path = [NSString stringWithFormat:@&quot;~/Library/Application Support/Billto/%@.plist&quot;, [allBillings objectAtIndex:rowIndex]];<br />		NSString *realPath = [path stringByExpandingTildeInPath];<br />		NSString *plist = [self returnBillingInfoForKey:@&quot;BTpaid&quot; ofPlist:realPath];<br />
    


    - (NSString *)returnBillingInfoForKey:(NSString *)key ofPlist:(NSString *)plistPath<br />{<br />	NSDictionary *plistDictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];<br />	NSString *value = [plistDictionary objectForKey:key];<br />	return value;<br />}
    


    Mais la valeur de plist est (NULL), pourtant le chemin existe et est correct.
  • yoannyoann Membre
    02:03 modifié #21
    Si c'est le même plist qu'écrit en page précédente c'est normal tu a enregistré sur le disque un NSArray et là  tu cherche à  le prendre comme NSDictionary
  • apocaalypsoapocaalypso Membre
    02:03 modifié #22
    Merci Yoann, c'est logique.
    J'ai opté pour la méthode suivante qui m'a l'air plus claire :
    NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
    


    Merci à  tous de votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.