CoreData et les mises à  jour du modèle

dualg4dualg4 Membre
05:00 modifié dans API AppKit #1
Bonjour à  tous,

Dans le cadre de la création d'un logiciel de généalogie , je viens d'expérimenter très brièvement CoreData, et tout ça me semble vraiment génial.
Mais je me posais la question suivante:
Si je crée une version 1 d'un logiciel et que demain, je modifie le modèle objet (à  cause de bug ou pour améliorer) pour une version 2, pourrais je relire automatiquement mes fichiers générés par l'application version 1 dans la version 2?

Merci de vos réponses

Réponses

  • Eddy58Eddy58 Membre
    05:00 modifié #2
    Je ne connais rien à  CoreData, mais normalement tu devrais pouvoir spécifier le numéro de version de ton modèle (utilisable si celui-ci utilise le protocole NSCoding), avec la méthode setVersion, pour ensuite le comparer pour faire plusieurs séquences de décodages si dans le futur plusieurs versions de ton modèle existent. :)
  • 05:00 modifié #3
    Petit test rapide, lorsque l'on modifie le modèle on peut toujours ouvrir les documents créé avec l'ancienne version. En tout cas lorsque l'on se contente d'ajouter des éléments. Mais je ne sais pas comment faire lorsque l'on doit faire des opérations un peu complexes pour importer les anciens documents (combiner plusieurs champs, ...)
  • Eddy58Eddy58 Membre
    mai 2005 modifié #4
    Voici un exemple repris de Cocoa Programming : :)

    Soit l'ancienne structure de la classe modèle, version 0 : (MYCircleGraphic est sous-classe de MYGraphic)
    [tt]
    @interface MYCircleGraphic:MYGraphic
    {
         NSPoint _myCenter;
         int _myRadius;
    }
    [/tt]

    Dans la nouvelle version (version 1), on remplace le int par un float :
    Interfaçage :
    [tt]
    @interface MYCircleGraphic:MYGraphic
    {
         NSPoint _myCenter;
         float _myRadius;
    }
    +(void)initialize;
    -(void)encodeWithCoder:(NSCoder *)coder;
    -(id)initWithCoder:(NSCoder *)coder;
    [/tt]

    Implémentation:
    [tt]
    @implementation MYCircleGraphic

    +(void)initialize
    {
         [MYCircleGraphic setVersion:1];
    }

    -(void)encodeWithCoder:(NSCoder *)coder
    {
         [super encodeWithCoder:coder];
         [coder encodeValueOfObjCType:@encode(NSPoint) at:&_myCenter];
         [coder encodeValueOfObjCType:@encode(float) at:&_myRadius];
    }

    -(id)initWithCoder:(NSCoder *)coder
    {
         self=[super initWithCoder:coder];
         [coder decodeValueOfObjCType:@encode(NSPoint) at:&_myCenter];
         if ([coder versionForClassName:@MYCircleGraphic]<1)
         {
              int temp;
              [coder decodeValueOfObjCType:@encode(int) at:&temp];
              _myRadius=(float)temp;
         }
         else
         {
              [coder decodeValueOfObjCType:@encode(float) at:&_myRadius];
         }
         return self;
    }
    [/tt]

    La version de la classe modèle est d'abord comparée avec la méthode versionForClassName. Si on est dans une version 0, on décode l'integer dans une variable temporaire, que l'on cast ensuite en float, sinon on utilise la procédure de décodage normal.
  • amnesicamnesic Membre
    05:00 modifié #5
    En voyant le code Eddy58, je me demandais s?il ne valait pas mieux utiliser les NSKeyedArchiver (apparu uniquement à  partir de Jaguar, mais comme c'est avec CoreData pas de soucis) dans les méthodes
    encodeWithCoder et initWithCoder ? Cela semble plus souple que les méthodes NSCoder qui nécessitent de respecter l'ordre de codage/décodage .  Qu'en pensez-vous ?
  • mai 2005 modifié #6
    Donc avec core data on peut toujours utiliser initWithCoder et EncodeWithCoder?
    ---
    j'ai trouvé la réponse à  cette question sur une mailing liste : http://lists.apple.com/archives/cocoa-dev/2005/May/msg00640.html
  • Eddy58Eddy58 Membre
    05:00 modifié #7
    dans 1117217897:

    En voyant le code Eddy58, je me demandais s?il ne valait pas mieux utiliser les NSKeyedArchiver (apparu uniquement à  partir de Jaguar, mais comme c'est avec CoreData pas de soucis) dans les méthodes
    encodeWithCoder et initWithCoder ? Cela semble plus souple que les méthodes NSCoder qui nécessitent de respecter l'ordre de codage/décodage .   Qu'en pensez-vous ?

    Oui amnesic, je connaissais pas, c'est en effet un moyen plus pratique pour gérer différentes versions d'un modèle.:)
Connectez-vous ou Inscrivez-vous pour répondre.