96 votes

Que dois-je faire pour que Core Data migre automatiquement les modèles?

J'ai lu dans la documentation sur la migration automatique / légère pour les modèles Core Data - mais j'ai du mal à l'implémenter.

Si je comprends bien, l'application doit remarquer que le modèle et le modèle existant sur un périphérique ne sont pas identiques. Si vous avez uniquement ajouté des attributs ou des relations et des modifications simples similaires, le modèle doit être mis à niveau automatiquement.

N'importe quel pointeur - dois-je définir quelque chose dans xCode?

139voto

Grouchal Points 7053

J'ai maintenant trouvé que c'est assez simple une fois que vous savez où chercher.

Dans mon AppDelegate j'ai mis en place le NSPersistentStoreCoordinator - et vous avez besoin d'ajouter quelques options pour ce à dire qu'il à manipuler auto-migrer:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:

[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,

[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

NSError *error;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    // Handle error
    NSLog(@"Problem with PersistentStoreCoordinator: %@",error);
}

Ensuite, vous avez besoin de faire un petit truc dans xCode:

  1. Sélectionnez votre fichier xcdatamodel
  2. Sélectionnez le Menu en haut, puis Modèle de Données, puis choisissez Ajouter un Modèle de Version
  3. Votre fichier xcdatamodel seront ensuite déplacés dans un nouveau répertoire avec le même nom que votre fichier xcdatamodel mais avec l'extension xcdatamodeld - il y aura un deuxième fichier dans ce répertoire avec un 2 dans le nom. Sélectionnez le nouveau fichier, et de la Conception->Modèle de Données>Définir la Version Actuelle (dans Xcode 4 vous faites cela)
  4. Si vous avez déjà effectué les changements qui ont causé à votre projet d'être incompatibles - prendre ces changements de l'origine de fichier xcdatamodel. Si vous avez encore à faire les changements -, alors il suffit d'éditer le 2.fichier xcdatamodel (celui que vous venez de faire de la version actuelle).
  5. Maintenant, lorsque vous installez cette version sur un appareil qui a l'ancien modèle, il sera automatiquement mis à niveau que modèle pour le nouveau modèle.

Cela me semble excellent et aussi simple que je voulais, mais je pense que vous devez être prudent lors de développement que vous modifiez un modèle - sinon, vous devrez créer une nouvelle version pour chaque changement.

Je pense que ce que je vais faire c'est que je vais garder tous les fichiers modifiés et puis une fois que je m'apprête à déployer une mise à jour, je vais supprimer tous les en entre les fichiers et juste de déployer avec les plus anciens et les plus récents modèles.


Mise à JOUR (15/07/2011):

Grâce à @rockstarberlin de remarquer il y a une documentation à jour chez apple:

Xcode 4: la définition d'un Objet Géré Modèle de la Version Actuelle

Mise à jour: 8/19/2013 de mieux faire le lien:

https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/CoreDataVersioning/Articles/vmModelFormat.html

14voto

Scott Means Points 131

C'était incroyablement utile. La documentation d'Apple était - comme d'habitude - malheureusement incomplète. Je recommande de faire une construction propre, car j'ai rencontré une erreur "Impossible de fusionner les modèles avec deux entités différentes xxx" lors de ma première exécution après ces modifications. La version propre a résolu le problème.

6voto

Santthosh Points 635

La réponse de Grouchal est parfaite ... mais si vous avez toujours le "Impossible de fusionner les modèles avec deux entités différentes xxx" même après avoir nettoyé plusieurs fois la version ... Vous pourriez avoir des problèmes avec le chargement de managedObjectModel. . Regardez à celui-ci ... ce qui m'a aidé à le réparer ..

problèmes de migration de données de base

3voto

dreyln Points 370

Aussi, si vous tombé sur ce post, comme je l'ai fait, après l'obtention de la "Le modèle utilisé pour ouvrir le magasin est incompatible avec celui utilisé pour créer le magasin d'erreur" et vous êtes juste de débogage à l'aide du simulateur et de vouloir remplacer l'ancien modèle installé, vous pouvez Réinitialiser le Simulateur de l'application ou la suppression de votre application dans le simulateur serait probablement travailler aussi bien.

Il n'a pas eu lieu pour moi d'essayer jusqu'à ce que la lecture des posts ici, à quel point j'ai réalisé que j'avais installé l'application dans le simulateur, puis par la suite changé le modèle, provoquant ladite erreur d'exécution.

1voto

rockstarberlin Points 1176

le menu dans Xcode 4 a changé un peu. voici une description comment le faire dans Xcode 4:

Xcode 4: Définition de la version actuelle d'un modèle d'objet géré

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X