CoreData et les mises à jour du modèle
dualg4
Membre
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
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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
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 ?
---
j'ai trouvé la réponse à cette question sur une mailing liste : http://lists.apple.com/archives/cocoa-dev/2005/May/msg00640.html
Oui amnesic, je connaissais pas, c'est en effet un moyen plus pratique pour gérer différentes versions d'un modèle.:)