Fichier > importer

VeillardVeillard Membre
15:24 modifié dans API AppKit #1
Bonjour,

Tout est dans le titre  :P

Je vouvrais importer des données (sans avoir à  modifier mon code à  chaque fois) pour récupérer des données en XML.
Quelle est la procédure habituelle ? (menus, dialogues...) et surtout les erreurs à  éviter.

Merci

Réponses

  • fouffouf Membre
    15:24 modifié #2
    Avec quel editeur veut tu faire ca ??

    Et puis, veux-tu faire ca avec un editeur ou a la  limite, la ligne commande (CVS ou equivalent) ca te va ??
  • VeillardVeillard Membre
    15:24 modifié #3
    Ce que je cherche à  faire, c'est importer d'anciennes données en XML avec :

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


    puis réenregistrer mes données avec :

    - (NSData *)dataRepresentationOfType:(NSString *)aType<br />{<br />&nbsp; &nbsp; [plongeesTableView deselectAll:nil];<br />&nbsp; &nbsp; return [NSArchiver archivedDataWithRootObject:carnet];<br />}<br />
    


    ... mais en ayant la possibilité de lire aussi le nouveau format avec :

    - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType<br />{<br />&nbsp; &nbsp; [carnet release];<br />&nbsp; &nbsp; carnet = [[NSUnarchiver unarchiveObjectWithData:data] retain];<br /><br />&nbsp; &nbsp; [self updateUI:nil];<br />&nbsp; &nbsp; return YES;<br />}<br />
    


    Bref, comment implémenter proprement une fonction d'importation...
  • Eddy58Eddy58 Membre
    15:24 modifié #4
    Tu peux implémenter le modèle de tes anciennes données dans ton code, ensuite après avoir chargé un ancien fichier, tu récupères les données que tu copies dans des instances de ton nouveau modèle, ensuite tu n'as plus qu'à  enregistrer le fichier....enfin c'est comme ça que je ferais. En ce qui concerne la façon de mettre ça dans la GUI, je rajouterais un Item dans le menu fichier du genre "Importer et convertir..." qui ouvrirait un file panel pour choisir un fichier et ensuite lancerait la méthode de conversion. :P :)
  • VeillardVeillard Membre
    15:24 modifié #5
    OK je pensais faire quelque chose de ce genre, je voulais en être sûr avant de me lancer

    Merci
  • fouffouf Membre
    15:24 modifié #6
    Est-ce que l'on peut utiliser la methode setVersion: avec une classe faite maison ??

    Je m'explique : T'as cree un classe XMLData:NSData. Dans initialize, on ecrit un un truc du genre [self setVersion:1] (dans la premiere version), creer un modele de donnees ; puis dans une version ulterieure, mettre a jour initialize en mettant [self setVersion:2]. Ensuite, dans readFromFile: ou dans loadData:ofType: de MyDocument ecrire un truc du genre


    <br />- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType<br />{<br />if([(XMLData)data version ] == 1){<br />// decodage du modele pour la version 1<br />}else if([(XMLData)data version] ==2){<br />// decodage du modele pour la version 2<br />}<br /><br />// suite de du decodage<br />}
    


    Merci d'avance

    PS:j'ai peut-etre fait des erreurs en codant : je suis en ce momant sur un PC sous Widows B) :why?: :'(
  • VeillardVeillard Membre
    15:24 modifié #7
    J'en suis pas sûr.  ???

    - (BOOL)readFromFile:(NSString*)aPath ofType:(NSString*)type
    

    et
    - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType
    

    sont deux méthodes différentes.
    La première utilise des clés (Array, Dict), la seconde fait appel au décodage des données avec
    - (id)initWithCoder:(NSCoder *)coder
    
  • VeillardVeillard Membre
    15:24 modifié #8
    dans 1105562839:

    Tu peux implémenter le modèle de tes anciennes données dans ton code, ensuite après avoir chargé un ancien fichier, tu récupères les données que tu copies dans des instances de ton nouveau modèle, ensuite tu n'as plus qu'à  enregistrer le fichier....enfin c'est comme ça que je ferais.  En ce qui concerne la façon de mettre ça dans la GUI, je rajouterais un Item dans le menu fichier du genre "Importer et convertir..." qui ouvrirait un file panel pour choisir un fichier et ensuite lancerait la méthode de conversion. :P :)


    Par contre, comment je fais pour faire cohabiter :
    - (BOOL)readFromFile:(NSString*)aPath ofType:(NSString*)type
    

    et
    - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType
    


    L'un risque d'intéragir avec l'autre ?
  • cbrandtcbrandt Membre
    15:24 modifié #9
    je pense qu'on utilise l'un OU l'autre, et on ne les fait pas cohabiter, justement...
  • VeillardVeillard Membre
    15:24 modifié #10
    Donc pour importer mes données, il faut que je créée une classe supplémentaire ???
  • cbrandtcbrandt Membre
    15:24 modifié #11
    je pense qu'il est peut-être plus simple d'ajouter une méthode au documentcontroller, et de lier l'item de menu à  cette méhode ?
  • VeillardVeillard Membre
    15:24 modifié #12
    OK, dans mon documentController, j'ai écrit :
    - (IBAction)importFromOlderVersion:(id)sender<br />{<br />&nbsp; &nbsp; // implémentation des anciennes données<br />}<br />
    


    à  quel endroit je mets :
    - (BOOL)readFromFile:(NSString*)aPath ofType:(NSString*)type
    
    ???
  • cbrandtcbrandt Membre
    15:24 modifié #13
    c'est une document-based app, je pense ??

    je suppose que tu veux importer des données dans un document existant. dans ce cas, dans ton MyDocument.m tu as
    <br />- (BOOL)readFromFile:(NSString*)aPath ofType:(NSString*)type<br />
    

    que tu utilises pour lire un fichier au format normal, et pour importer des données, dans
    <br />- (IBAction)importFromOlderVersion:(id)sender<br />
    

    tu ajoutes simplement le code pour afficher la fenêtre de choix de fichier + lire l'ancien format...
  • VeillardVeillard Membre
    janvier 2005 modifié #14
    c'est une document-based app, je pense ??

    Oui

    e suppose que tu veux importer des données dans un document existant. dans ce cas, dans ton MyDocument.m tu as
    Code:
    - (BOOL)readFromFile:(NSString*)aPath ofType:(NSString*)type
    que tu utilises pour lire un fichier au format normal...


    J'ai plutôt :
    - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType
    

    Pour lire mes fichiers au format normal

    et pour importer des données, dans
    Code:
    - (IBAction)importFromOlderVersion:(id)sender
    tu ajoutes simplement le code pour afficher la fenêtre de choix de fichier + lire l'ancien format...

    Toujours dans myDocument ou le Controller ?
    Pour lire l'ancien format, jai :
    - (BOOL)readFromFile:(NSString*)aPath ofType:(NSString*)type
    

    Comment je fais pour l'intégrer dans :
    - (IBAction)importFromOlderVersion:(id)sender
    
    ???
  • fouffouf Membre
    15:24 modifié #15
    Je pense qu'il faut que tu fasses comme ca :

    <br />if(![self loadRepresentation:anciennesDonnes ofType:leTypeDesDonnees]){<br />NSLog(@&quot;erreur dans la chargement des anciennes donnees&quot;);<br />}<br />
    


    Et la ca devrait se charger correctement.
  • VeillardVeillard Membre
    15:24 modifié #16
    OK, je vais essayer...
  • VeillardVeillard Membre
    15:24 modifié #17
    Bon après un épisode de grippe dans la famille, j'essaie de me lancer à  nouveau dans cette importation.
    J'ai essayé différentes méthodes sans succès peut-être que je m'y prends mal.  ???
    Ma classe "Carnet.m" est un NSDocument auquel j'ai mis :
    - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType<br />{<br />&nbsp; &nbsp; [_carnet release];<br />&nbsp; &nbsp; _carnet = [[NSUnarchiver unarchiveObjectWithData:data] retain];<br /><br />&nbsp; &nbsp; [self updateUI:nil];<br />&nbsp; &nbsp; return YES;<br />}<br />
    

    Pour charger mes données "normales". J'ai essayé de créer une auctre classe avec quelque chose du style :
    #import &quot;Importer.h&quot;<br /><br /><br />@implementation Importer<br /><br />- (IBAction)importFromVersion20:(id)sender<br />{<br />	[self openDocument:nil];<br />}<br /><br />- (BOOL)readFromFile:(NSString*)aPath ofType:(NSString*)type<br />{<br />	[_carnetV20 autorelease];<br />	_carnetV20 = [[NSMutableArray alloc] initWithContentsOfFile:(NSString *)aPath];<br />	return YES;<br />}<br />
    

    Mais il me met : "'Importer' may not respond to '- openDocument:'

    Existe-t-il un tuto qui explique pas à  pas ce qu'il faut faire ?
  • mpergandmpergand Membre
    15:24 modifié #18
    Salut Favouille  :o

    Ma soluce du dimanche soir  ::)  pas testée  :)

    Dans ton NSDocument de base  :



    - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType
    {
        [_carnet release];
        _carnet =[NSUnarchiver unarchiveObjectWithData:data];

        if( _carnet==nil)     // il a pas aimé, ça doit pas être la bonne version :)
           if([self importFromVersion20: data]==FALSE)   // format XML ?
                {
                // affiche msg d'alerte, format non reconnu
                 return NO;
                }

        [_carnet retain];

        [self updateUI:nil];
        return YES;
    }

    (BOOL)importFromVersion20:(NSData*)data
    {
       // à  toi de bosser là  ;)

    return TRUE;
    }


  • VeillardVeillard Membre
    15:24 modifié #19
    Merci Marc, j'ai essayé ta méthode permettant de vérifier le type de fichier et ça marche !
    Par contre, je sèche toujours sur :

    - (BOOL)importFromVersion20:(NSData*)data
    

    Je ne sais pas quoi mettre dedans. J'ai bien pensé mettre quelque chose du style :

    _carnet = [[NSMutableArray alloc] initWithContentsOfFile:(NSString *)aPath];
    

    Pour pouvoir lire mes fichiers XML mais ce qui me chagrine, c'est le "(NSData*)data" de la méthode "importFromVersion20:" alors que dans

    - (BOOL)readFromFile:(NSString*)aPath ofType:(NSString*)type
    

    je n'ai pas de "(NSData*)data" pour lire mes fichiers XML.
    Une idée ? ???
  • mpergandmpergand Membre
    février 2005 modifié #20
    Avec cette méthode les deux types de fichiers sont chargés de manière indifférenciée ( puisque, si je comprends bien, les deux types de fichiers possèdent la même extension  ;) )

    Donc dans la méthode : loadDataRepresentation, tu reçois un NSData des données du fichier chargé quelque soit son type.

    Donc il suffit de passer ce même NSData à  la méthode de conversion:
    <br /> (BOOL)importFromVersion20:(NSData*)data<br />{<br />   NSArray* old=[NSPropertyListSerialization propertyListFromData: data .......];<br /><br />   // à  toi de bosser là  <br /><br /> return TRUE;<br />}<br />
    


    peut-être une autre solution pour charger le plist (donc pas besoin de NSData):
        NSArray* old=[NSArray arrayWithContentsOfFile: [self fileName]];
  • VeillardVeillard Membre
    15:24 modifié #21
    J'ai opté pour la deuxième solution avec une petite modif et ça marche  :brule:

    _carnet = [[NSMutableArray alloc] initWithContentsOfFile:[self fileName]];
    


    Merci 
  • VeillardVeillard Membre
    15:24 modifié #22
    Bon autre chose. J'ai eu la mauvaise idée de renommer certaines variables et du coup celles-ci sont écartées lors du chargement de mon nouveau fichier.  :-\\
    Message :

    +[NSUnarchiver unarchiveObjectWithData:]: extra data discarded
    


    J'ai essayé de faire ceci pour récupérer mes données mais sans succès...

    [[[_carnet objectAtIndex:i] valueForKey:@&quot;tempEau&quot;] setObjectValue:[[_carnet objectAtIndex:i] valueForKey:@&quot;temperature eau&quot;]]
    

    Où "temperature eau" est mon ancienne clé XML et "tempEau" ma nouvelle variable.
Connectez-vous ou Inscrivez-vous pour répondre.