Migration d’un modèle Coredata

mercredi 25 juin 2014

Si comme moi lors de la mise à jour d’une application existante, vous avez besoin de mettre à jour soit des données soit au niveau de la structure du modèle, vous risquez de tomber sur une erreur du genre

"reason=The model used to open the store is incompatible with the one used to create the store"
si vous avez modifié directement dans le Coredata model!

Dans mon cas, c’était uniquement rajouter une entity qui n’interagit en rien avec mes autres entités précédemment créé dans mon application.

Premier point, il faut créer un nouveau model sur base du précédent, Design > Data Model > add Model version.
Il va transformer votre xcdatamodel du projet en xcdatamodeld versionné.
Il créé un nouveau fichier que vous pouvez renommé en V1 et ensuite il suffit de copier le contenu de votre modèle actuel (petit v vert) dans ce nouveau fichier. Maintenant nous avons deux modèles identiques.Et donc maintenant le datamodel avec le v vert correspond au datamodel principal et c’est donc dans celui là que je vais rajouter mes entités.

Ensuite, remplacer le type de fichier mom en momd dans – (NSManagedObjectModel *)managedObjectModel

Donc maintenant, le modèle est versionné pour que les utilisateurs ayant ce modèle installé puisse lancer l’application sans crash en v2.

Second point, il faut créer un fichier de mapping pour dire à notre application les modifications apportées au nouveau modèle.
Pour se faire add new file choisir Mapping Model, on définit maintenant le modèle d’origine (V1) et d’arrivée (celui avec le v vert).
Un fichier Model.xcmappingmodel est alors créé, il ne reste plus qu’ à dire à notre storecoordinator que l’on a plusieurs versions du modèle et il gère le reste.

Pour cela, on doit rajouter les options dans – (NSPersistentStoreCoordinator *)persistentStoreCoordinator

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

Tags: CoreData