64 votes

Données de base de l'iPhone "Migration légère et automatique".

Je tente de mettre à jour une application qui met en œuvre un magasin de données principal. J'ajoute un attribut à l'une des entités.

J'ai ajouté le code suivant à ma classe de délégué :

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Shoppee.sqlite"]];

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

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        NSLog(@"Error: %@",error);
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator;
}

C'était à partir de l'URL suivante : Doc

J'obtiens l'erreur suivante en exécutant le code :

2009-12-01 20:04:22.877

Shoppee [25633:207] Erreur : Erreur

Domain=NSCocoaErrorDomain Code=134130

UserInfo=0x1624d20 "L'opération n'a pas pu être achevée. (Erreur Cocoa 134130.)" 2009-12-01 20:04:22.879 Shoppee [25633:207] Erreur non résolue Erreur Domain=NSCocoaErrorDomain Code=134130 UserInfo=0x1624d20 "L'opération n'a pas pu être achevée. (Cocoa error 134130.)", { URL = file://localhost/Users/Eric/Library/Application%20Support/iPhone%20Simulator/User/Applications/A8A8FB73-9AB9-4EB7-8F83-82F5B4467AF1/Documents/MyApp.sqlite ; metadata = { NSPersistenceFrameworkVersion = 241 ; NSStoreModelVersionHashes = { Item = <869d4b20 088e5c44 5c345006 87d245cd 67ab9bc4 14cadf45 180251e9 f741a98f> ; Store = <47c250f4 895e6fd1 5033ab42 22d2d493 7819ba75 3c0acffc 2dc54515 8deeed7a> ; } ; NSStoreModelVersionHashesVersion = 3 ; NSStoreModelVersionIdentifiers = ( ) ; NSStoreType = SQLite ; NSStoreUUID = "8DC65301-3BC5-42BE-80B8-E44577B8F8E1" ; } ; reason = "Impossible de trouver un modèle pour le magasin source" ; } ;.

Il semble que je doive inclure le modèle de données d'origine, mais je ne sais pas comment m'y prendre. Avez-vous des suggestions ?

145voto

Stian Høiland Points 1699

Pour récapituler/guide complet :

  1. Avant d'effectuer toute modification, créez une nouvelle version du modèle.

    Dans Xcode 4 : Sélectionnez votre .xcdatamodel -> Editeur -> Ajouter un modèle Version.

    Dans Xcode 3 : Design -> Data Model -> Add Model Version.

    Vous verrez qu'un nouveau .xcdatamodel est créé dans votre .xcdatamodeld (qui est également créé si vous n'en avez pas) .

  2. Économisez.

  3. Sélectionnez votre nouveau .xcdatamodel et effectuer le changement que vous souhaitez employer conformément à le site Migration légère documentation .

  4. Économisez.

  5. Définissez le schéma actuel/actif sur le schéma nouvellement créé.

    Avec le .xcdatamodeld dossier sélectionné :

    Dans Xcode 4 : barre latérale Utilitaires -> Inspecteur de fichiers -> Modèle de données de base versionné -> Sélectionner le nouveau schéma.

    Dans Xcode 3 : Design > Data Model > Set Current Version.

    La coche verte sur le .xcdatamodel sera déplacée vers le nouveau schéma.

  6. Économisez.

  7. Mettre en œuvre le code nécessaire pour effectuer la migration au moment de l'exécution.

    Où votre NSPersistentStoreCoordinator est créé (généralement la classe AppDelegate), pour l'élément options remplace le paramètre nil avec le code suivant :

    [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                      [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
  8. Lancez votre application. S'il n'y a pas de crash, vous avez probablement réussi la migration :)

  9. Une fois la migration réussie, le code de migration (étape 7) peut être retiré. (Il appartient au développeur de déterminer quand les utilisateurs d'une application publiée peuvent être considérés comme ayant migré).

IMPORTANT : Ne supprimez pas les anciennes versions de modèles/schémas. Core Data a besoin de l'ancienne version pour migrer vers la nouvelle.

26voto

Eric Points 714

J'ai compris.

Conception > Modèle de données > Ajouter une version du modèle

16voto

davetron5000 Points 9622

Pour les Googlers encore, voici ce que vous devez faire (en supposant que vous avez déjà mis en place la migration légère) :

  1. Avant de faire des changements, faites Design -> Data Model -> Add Model Version (vous verrez qu'un nouveau .xcdatamodel est créé dans votre .xcdatamodeld dossier)
  2. Sauvez
  3. Faites votre changement
  4. Sauvez
  5. Run App

L'étape 1 est cruciale pour que ça marche. J'ai rencontré ce problème parce que j'avais suivi ces étapes pour ajouter un nouveau champ. Cela a fonctionné. J'ai ajouté un deuxième nouveau champ, mais j'ai oublié d'"Ajouter la version du modèle", et les choses ont explosé.

11voto

Gmu Points 328

Aussi pour les googleurs Règle simple, ne jamais supprimer/éditer une ancienne version numérotée. Lorsque vous ajoutez une version du modèle, le suffixe du numéro augmente comme 2..3..4, ce qui signifie que 2 est la plus ancienne, 3 la suivante, etc. mais la version actuelle à modifier est la version non numérotée.

Ne supprimez pas les anciennes versions du modèle, car les utilisateurs de la base de données précédente utilisant une ancienne version du modèle ne pourront pas migrer vers votre dernier modèle de base de données sans comparer les anciens et les derniers schémas.

5voto

rustyshelf Points 16336

Juste une remarque pour ceux qui trouveront cette information sur Google, il semble que même avec la migration auto(magic), vous devez toujours créer une version de votre magasin d'origine, et une nouvelle, et définir la nouvelle comme la version actuelle.

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