184 votes

Le modèle utilisé pour ouvrir le magasin n’est pas compatible avec celui utilisé pour créer le magasin

J'ai créé une Base de Données de modèle dans xcode 3.2 et après la mise à niveau dans Xcode 4.2, j'ai ensuite ajouté une nouvelle entité de la NSManagedObject sous-classe (reportez-vous à la nouvelle entité).

Première chose, il semble bizarre parce que ce n'est pas dans le même groupe que l'ancien. Voici la photo sur mon xcode 4.2 (AlkitabDB est celui que j'ai créé dans xcode 3.2, EndeDB est la nouvelle l'un de l'actuel xcode version(4.2):

the new entity do not grouped in xdatamodel

Deuxième chose, je le laisse comme il est, alors j'ai accédé à la deuxième entité (le nouveau) de la même manière que la première entité (l'ancien), et l'erreur comme intitulé s'affiche.

Voici le message d'erreur:

2012-01-16 21:13:38.496 iHuria[55953:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn't be completed. (Cocoa error 134100.)" UserInfo=0x8829cd0 {metadata=<CFBasicHash 0x882a370 [0x1839b38]>{type = immutable dict, count = 7,
entries =>
    2 : <CFString 0x8829b90 [0x1839b38]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x8829ff0 [0x1839b38]>{type = immutable, count = 0, values = ()}
    4 : <CFString 0x8829bc0 [0x1839b38]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x8829770 [0x1839b38]>{value = +320, type = kCFNumberSInt64Type}
    6 : <CFString 0x8829bf0 [0x1839b38]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x882a080 [0x1839b38]>{type = immutable dict, count = 1,
entries =>
    0 : <CFString 0x882a010 [0x1839b38]>{contents = "AlkitabDB"} = <CFData 0x882a030 [0x1839b38]>{length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd}
}

    7 : <CFString 0x10e3aa8 [0x1839b38]>{contents = "NSStoreUUID"} = <CFString 0x8829e60 [0x1839b38]>{contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"}
    8 : <CFString 0x10e3948 [0x1839b38]>{contents = "NSStoreType"} = <CFString 0x10e3958 [0x1839b38]>{contents = "SQLite"}
    9 : <CFString 0x8829c40 [0x1839b38]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x6b1c7c0 [0x1839b38]>{value = +3, type = kCFNumberSInt32Type}
    10 : <CFString 0x8829c70 [0x1839b38]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x882a0c0 [0x1839b38]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            AlkitabDB = <d02ac5f8 be6ab0b3 9add450a ca202ac0 ebd1e860 cbb578c2 3d45d462 998d2ccd>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}

J'ai cherché la solution avant et j'ai découvert que j'devez supprimer l'application de simulateur et exécutez à nouveau l'application, et ça ne fonctionne pas. Quelqu'un sait-il une solution pour ce problème? S'il vous plaît aider.

304voto

Stas Points 4493

La suppression de l'application est parfois pas le cas! Suggérer, votre application a déjà été publié! Vous ne pouvez pas ajouter de nouvelles entités de la base de données et allez - y, vous avez besoin pour effectuer la migration!

Pour ceux qui ne veulent pas creuser dans la documentation, à la recherche d'une solution rapide:

  1. Ouvrez votre .fichier xcdatamodeld
  2. cliquez sur l'Éditeur de
  3. sélectionnez Ajouter un modèle de la version...
  4. Ajouter une nouvelle version de votre modèle (le nouveau groupe de datamodels ajouté)
  5. sélectionnez le fichier, ouvrir un fichier inspecteur (panneau de droite)
  6. et en vertu de l' Versioned core data model sélectionnez votre nouvelle version de modèle de données pour l'actuel modèle de données
  7. Ce n'EST PAS TOUT ), Vous devez effectuer soi-disant "la lumière de la migration".
  8. Accédez à votre AppDelegate et de trouver où l' persistentStoreCoordinator est en cours de création
  9. Trouver cette ligne, if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. Remplacer nil des options avec @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} (effectivement prévu dans le code commenté dans la méthode)
  11. Ici, vous allez, amusez-vous!

P. S. Ceci ne s'applique que pour la légèreté et la migration. Pour votre migration vers le qualifier comme une légère migration, vos modifications doivent être confinés cette étroite bande:

  • Ajouter ou supprimer une propriété (attribut ou relation).
  • Faire un nonoptional propriété facultative.
  • Faire un attribut facultatif nonoptional, aussi longtemps que vous fournir une valeur par défaut.
  • Ajouter ou supprimer une entité.
  • Renommer une propriété.
  • Renommer une entité.

285voto

Philippe Sabourin Points 4957

Pour supprimer l'application dans le simulateur et d'effectuer un nettoyage sur votre projet. Que faut éclaircir ces questions. Assurez-vous que vous n'êtes pas en cours d'exécution dans le débogueur lorsque vous supprimez l'application sinon ça ne supprime pas réellement correctement.

Si vous voulez être sûr de son parti, vérifiez ce répertoire Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/ pour votre application dans le dossier, en vertu de la version que vous utilisez.

Note: C'est pour le développement. Pour la production, vous avez besoin pour mettre en œuvre une sorte de migration. Google "Base de Données de Migration", avec une légère migration étant le plus simple.

23voto

Bhavin Points 12613

Réponse : Supprimer l’app du simulateur, effectuer un nettoyage et re-construire votre projet.

Remarque : Chaque fois que vous effectuez des modifications à la définition de base de données, supprimer l’application installée sur le périphérique physique ou le simulateur, nettoyer le projet et re-construire à nouveau.

14voto

Oui. Une fois vous supprimez l’application sur le périphérique physique et reconstruisez œuvres.

10voto

pierr Points 9148

Chaque fois que vous faire changer la définition de la Date de base, vous devez supprimer les applications installées sur le périphérique physique ou un simulateur.

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