0

J'essaie d'effectuer une migration légère, mais j'ai un problème à cause de la façon dont j'ai créé mon modèle de données initial. Le modèle de données initial n'a pas été versionné, maintenant le code suivant:Migration de la migration automatique Core Data - passage du modèle de données non versionné au modèle de données versionné

-(NSManagedObjectModel *)managedObjectModel { 

    //NSLog(@"%s", __FUNCTION__); 
    if (managedObjectModel != nil) { 
     return managedObjectModel; 
    } 
    //managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

    NSString *mainPath = [[NSBundle mainBundle] pathForResource:@"myDatabase" ofType:@"momd"]; 

    NSURL *mainMomURL = [NSURL fileURLWithPath:mainPath]; 
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:mainMomURL]; 
    return managedObjectModel; 
} 

renvoie l'erreur: * Mettre fin application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: « * - [NSURL initFileURLWithPath:]: néant paramètre de chaîne '

Je suis assez sûr que c'est parce que le modèle de données initial - celui que j'ai déployé dans mon application à beaucoup de gens déjà - a eu l'extension de maman par opposition à l'extension de momd. Mais, si je prends cela et revenir à

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

Je reçois l'erreur: Mettre fin à l'application du fait exception uncaught « NSInvalidArgumentException », la raison: « Impossible de fusionner les modèles avec deux entités différentes nommées ...

J'espère que ce n'est pas la première fois que quelqu'un est confronté à cette situation ... Y a-t-il quelque chose que je puisse faire pour réussir la migration de tous mes utilisateurs actuels?

+0

J'espère que Marcus Zarra va peser .. – SAHM

+0

Des pensées? Est-ce que je manque quelque chose d'évident? – SAHM

Répondre

0

D'accord, je progresse. Selon la réponse de Yuji dans ce lien: Can't find momd file: Core Data problems

, je décide d'aller avec la ligne:

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

Après avoir installé l'ancienne version de l'appareil, en ajoutant des données, faire une construction propre avec la nouvelle version puis en installant la nouvelle version sur l'appareil, tout est mis à jour correctement. Sur le point d'essayer à nouveau dans le simulateur et avec mes autres cibles. C'est fou, as-tu parfois l'impression de faire la même chose que toi et d'obtenir des résultats différents parfois? Je publierai une mise à jour une fois que je serai plus loin ....

EDIT: Quelques développements intéressants. En l'état, ce projet a commencé comme l'une de mes applications et j'ai ajouté une autre application avec un code similaire (en tant que cible distincte) pour la réutilisation du code, une fois les deux applications déployées dans l'App Store. Puisque leurs bases de données étaient essentiellement les mêmes, j'ai juste utilisé le même xcdatamodel pour les deux. Ce qui a bien marché jusqu'à ... J'ai commencé à gérer ce problème de migration. Il s'avère que le code ci-dessus pour managedObjectModel fonctionne pour la cible originale dans le projet, mais pas pour la nouvelle cible.

Puis, j'ai trouvé ce commentaire par Marcus Zarra:

He probably either renamed the model or set up a version, both of which will leave an old compiled .mom file in the build directory. That is the #1 cause of this error I have seen.

dans ce lien: Core Data: Error, “Can't Merge Models With Two Different Entities Named 'foo' ”

Eh bien, nous sommes peut-être se rendre quelque part ici maintenant. La question est: dois-je maintenant apporter mon autre modèle de données original au projet et le mettre à jour? Où allons-nous à partir d'ici?

EDIT: D'accord, je pense avoir fait de bons progrès sur ce problème. N'hésitez pas à me corriger sur l'un des points suivants. Mais, d'après ce que j'ai appris jusqu'à présent:

Le nom de l'ensemble devrait rester le même, ou il y aura des problèmes avec la migration. Cela signifie, à mon avis, laisser probablement le nom du produit tel quel. Mais, il semble que changer le nom d'affichage de l'ensemble (qui est différent du nom de l'ensemble) est également défini dans l'app-info.fichier plist) ne blesse pas les choses, et en fait accomplit les objectifs ou changer le nom de l'ensemble en premier lieu. En outre (ma question originale!), Il est TOTALEMENT bien de passer d'un modèle de données non versionné à un modèle de données versionné, et en fait, il est prévu que c'est ce qui se passe généralement avec la première migration. Donc pas de problème là-bas.

Autre leçon apprise: le nom du modèle de données et le nom du fichier .sqlite ne sont pas nécessairement les mêmes! Une de mes (nombreuses) erreurs consistait à utiliser le nom de fichier .sqlite lors de la recherche du fichier momd. Lorsque vous recherchez le fichier momd (lors de la définition du managedObjectModel dans le délégué de l'application), utilisez le nom du fichier xcdatamodel! Dans le même ordre d'idées, je ne savais pas si durant ma migration j'utiliserais "mergedModelFromBundles" ou "initWithContentsOfURL". Une fois que j'ai eu les noms de fichiers corrects, initWithContentsOfURL a bien fonctionné (j'ai encore quelques tests à faire, mais je l'ai réussi à travailler avec les deux cibles d'applications, dans le simulateur et sur l'appareil.)

xcdatamodels et xCode 4 - quel que soit le motif, je ne peux pas supprimer le modèle de données intérimaire/inutilisé/inutile versions dans xCode 4. Donc, j'ai dû faire beaucoup de jeu de jambes fantaisie pour obtenir ces Just Right, y compris la suppression des modèles eux-mêmes (références seulement), faire des changements en utilisant "Afficher le contenu du paquet" dans le Finder, et en rajoutant les modèles. Il faut être TRÈS prudent quand on fait cela Une chose très intéressante est que j'ai besoin de deux xcdatamodels, un pour chacune des cibles de l'application avec lesquelles je travaille, et que les titres de xcdatamodel doivent correspondre à ceux de la version précédemment déployée version pour la migration au travail. Non seulement cela, mais le modèle actuel doit être celui sans numéro - il doit correspondre parfaitement le nom du modèle dans mon application déployée.

Cela a été très compliqué car xCode 4 ne voulait pas toujours coopérer lorsque je renommais des modèles et que je définissais différents modèles sur la version actuelle. Une chose intéressante était que, quand je devais définir un modèle qui était sous un autre modèle dans l'arbre comme le modèle actuel, xcode n'a pas aimé cela pendant l'exécution. J'ai donc dû littéralement aller dans le fichier .xcodeproj dans le Finder (avec l'application fermée), Afficher le contenu du paquet, éditer le fichier project.pbxproj, et changer l'ordre des datamodels pour mettre celui en cours en haut de la liste.

Eh bien, je pense que c'est presque tout. Si je pense à autre chose, je l'ajouterai ici. Je veux encore tester un peu plus, mais j'espère que certaines des choses que j'ai apprises aideront quelqu'un. Je sais que j'ai fait beaucoup de choses hackish, mais les temps désespérés appellent des mesures désespérées, et quand nous savons mieux nous faisons mieux ... Espérons que cela aide.

Questions connexes