2010-09-22 5 views
2

Je sais que c'est une question fréquemment posée, mais aucune des solutions que j'ai trouvées ne semble fonctionner pour moi.Core Data migration "impossible de fusionner des modèles avec deux entités différentes nommées 'foo'"

Voici ma situation: J'ai un modèle de données pour mon application, et je voulais y ajouter des versions. Donc, dans XCode, j'ai fait Design -> Data Model -> Ajouter une version du modèle. J'ai également mis à jour la méthode persistentStoreCoordinator de mon délégué pour ressembler à ceci:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
               stringByAppendingPathComponent: @"foo.sqlite"]]; 

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
          nil]; 
    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
     /*Error for store creation should be handled in here*/ 
    } 

    return persistentStoreCoordinator; 
} 

Juste pour vous assurer que tout fonctionnait toujours, je l'ai fait un nettoyage tout, construire et testé dans le simulateur. Tout a fonctionné jusqu'à présent. Ensuite, j'ai choisi le nouveau modèle de données de la version, l'a défini comme la version actuelle en utilisant XCode et ajouté un attribut supplémentaire à une entité. J'ai ensuite fait un tout nettoyer, construire. Et maintenant, chaque fois que je lance l'application, elle se bloque avec cette erreur: 'Impossible de fusionner des modèles avec deux entités différentes nommées' foo ''.

Qu'est-ce que je fais mal? J'ai essayé de m'assurer qu'aucun modèle de données n'est ajouté à la cible, en ajoutant juste le modèle de données de version actuel à la cible, et les deux. Chaque fois que je teste, je m'assure de tout nettoyer.

Quelqu'un peut-il nous éclairer sur les raisons pour lesquelles cela ne fonctionne pas pour moi?

EDIT:

ici est ma méthode de managedObjectModel:

- (NSManagedObjectModel *)managedObjectModel { 
    if (managedObjectModel != nil) { 
    return managedObjectModel; 
    } 
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

    return managedObjectModel; 
} 
+0

s'il vous plaît ajoutez votre - (NSManagedObjectModel *) Méthode managedObjectModel. Je suspecte le problème là-bas. –

Répondre

5

je l'ai déjà prévu cette mise en œuvre du getter managedObjectModel.

Dans votre implémentation, tous les modèles de l'ensemble sont fusionnés en un seul modèle. Par conséquent également toutes les versions dans le fichier .momd sont fusionnées résultant en des définitions d'entité en double.

Modifiez le code pour initialiser explicitement le modèle avec le fichier de modèle approprié et cela devrait fonctionner correctement.

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"datamodel" ofType:@"momd"]; 
NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];  
+0

Ce faisant, j'obtiens une erreur différente: "Ce NSPersistentStoreCoordinator n'a pas de magasins persistants, il ne peut pas effectuer d'opération de sauvegarde." – nan

+0

Log modelPath pour voir si vous avez réellement chargé un modèle d'objet géré valide. –

+0

J'ai fini par ne pas utiliser l'option permettant d'inférer automatiquement le modèle de mappage, et j'ai défini le mien. Maintenant tout fonctionne comme prévu. Merci. J'ai enregistré l'erreur pour le NSPersistentStoreCoordinator, et il dit qu'un modèle de mappage n'a pas pu être déduit. – nan

0

Si vous utilisez Version Models sur Core Data vous devez toujours initialiser la version du modèle que vous souhaitez utiliser. Sur le Application Bundle, vous trouverez un fichier avec l'extension .momd qui est le modèle complet. A l'intérieur de ce fichier, vous trouverez beaucoup de fichiers .mom à l'intérieur, chaque fichier .mom représente une version de votre modèle.

Si vous exécutez votre application et initialisez avec le fichier .momd et toutes les versions à l'intérieur, Core Data créerez toutes les versions et plus tard, nous aurons la « entité dupliquée » erreur, ne connaît les données fondamentales que utilisation de la version. Maintenant, la seule façon de résoudre le problème est de supprimer l'application, de pointer votre code sur le bon fichier .mom et de l'exécuter à nouveau, afin que les données de base ne créent qu'une seule version de la base de données interne.

est ici un bout de code qui font le travail:

NSString *fullModelName = @"myModel.momd"; // The name of the main model. 
NSString *modelVersionName = @"myModel1.0.mom"; // Only the name of the version. 
NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; 
NSString *modelPath = [NSString stringWithFormat:@"%@/%@/%@", bundlePath, fullModelName, modelVersionName]; 
// 
NSURL *modelURL = [NSURL fileURLWithPath:modelPath]; 
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
+0

NSString * modelPath = [NSString stringWithFormat: @ "% @/Contenus/Ressources /% @ /% @", bundlePath, fullModelName, modelVersionName]; – user3152121

Questions connexes