Utilisation de mergedModelFromBundles: et versioning (CoreData)
Je suis en train d'utiliser la fonction de migration dans CoreData. J'ai suivi la Documentation d'Apple. J'ai un problème dans la méthode suivante:
/**
Returns the managed object model for the application.
If the model doesn't already exist, it is created by merging all of the models found in the application bundle.
*/
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
/*
* NSInvalidArgumentException', reason: '*** -[NSCFArray insertObject:atIndex:]: attempt to insert nil'
* 2010-02-17 16:27:15.338 Patrimoine[3037:207]
*/
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
Il semble qu'il y a le même problème sur http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html
Pourtant, je n'ai choisir la méthode d'Apple suggère, en utilisant l'option de menu "Ajouter un Modèle de la Version".
Avez-vous une idée?
source d'informationauteur charlax
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour nettoyer votre projet. Dès que vous vous en "version" de votre modèle de Xcode déplace dans un bundle (dossier), mais il ne supprime pas l'ancien. Ce qui se passe alors, c'est que la prochaine fois que vous exécutez votre application, il existe deux copies de votre modèle dans le bundle; l'ancien et le nouveau qui est à l'intérieur de la momd bundle.
Fait un Projet -> Nettoyer Tout va résoudre ce problème.
Aussi, si vous renommez vos modèles à tout moment, assurez-vous et répétez le "set actuel modèle" étape par commutation d'une ancienne puis de nouveau à la plus récente du modèle de nouveau. Mon paramètre de construction ne serait pas réinitialisé automatiquement et ne cesse d'établir de l'actuel "nom du modèle" à une inexistant modèle, résultant dans exactement le même problème.
Vous pouvez toujours vérifier ce paramètre est correct dans la construction du dossier de la ressource, à l'intérieur de l'importation .momd répertoire dans un fichier nommé versioninfo.plist - le réglage pour le modèle actuel DOIT correspondre au nom de votre modèle.
J'ai trouvé que l'utilisation de la mergedModelFromBundel: la méthode ne semble pas fonctionner avec la migration; je suis passé à initWithContentsOfURL:, et il fonctionne très bien. Notez que vous devez init avec une URL pointant vers une ".momd" fichier.
Si vous changez de modèle de données à tout moment, veillez à Réinitialiser le Contenu et les Paramètres dans le simulateur, ou vous recevrez le message d'erreur que la version du modèle utilisée pour rendre le magasin n'est pas le même que le modèle utilisé pour y accéder.
Merci à tout le monde!
Ces tous travaillé, mais seulement après que j'ai utilisé le Propre de l'option de compilation.
Voir cette autre Débordement de Pile rubrique pour plus d'info:
À l'aide de mergedModelFromBundles: and versioning (CoreData)
L'iPhone de Base de Données de Référence a un assez décent d'écrire sur ce sujet. Le processus formel de la documentation est un "Automatique Léger de la Migration".
Merci encore,
--Batgar
Au premier abord, aucun de ces méthodes a fonctionné pour moi.
Je suis en utilisant XCode 4.
Réalisée propre, Propre Dossier de création, situé à l' .application fichier pour vérifier qu'il n'y en a aucun autre .fichier xcdatamodel là, sauf le bon (contenant à la fois les anciennes et nouvelles versions).
Essayé d'utiliser initWithContentsOfURL:.
Vérifié la version actuelle correspond à la bonne et n'a Réinitialiser le Contenu et les Paramètres sur le simulateur.
Puis édité le VersionInfo.plist et a découvert que la NSManagedObjectModel_CurrentVersionname valeur correspond à un non-existant version nom!
Afin de remettre le nom de la version de certains modèle existant (à vous de voir ensuite la coche verte en mutation), reconstruit et il a travaillé.
Pour info!
Malheureusement pour moi, ce n'était pas un problème de nettoyage ou le contrôle de version. J'ai un peu compliquée, avec plusieurs couches de imbriquée des projets Xcode. Pour traiter la question de chaque projet dans les différentes dépôt SVN, j'ai configurer les chemins d'accès à mes projets que par rapport à une source spécifique des arbres que j'ai mis en place dans le Xcode "Préférences --> les Emplacements". Pour exemple, j'ai mis en place FACEBOOK_IOS_SDK_SRC à point "~/Documents/{my_crazy_folder_structure}/facebook-ios-sdk/src". De cette façon, chaque fois que mes collègues de la caisse de mon projet, l'emplacement de l'Facebook SDK est par rapport à ce chemin, ils ont créé et n'a pas à être dans la même structure exacte sur leurs machines, car il est sur le mien. Je sais qu'il y a de meilleures façons de gérer cela, mais il est de travail pour l'instant.
De toute façon mon problème est venu parce qu'à un moment j'ai eu mon *.xcdatamodel emplacement de fichier comme "par rapport à {source_tree_path}", qui a trouvé le fichier il suffit de bien, et même compilé dans un *.maman fichier mais j'étais dingue d'erreur répertoriés dans la question initiale. J'ai changé ma position "par rapport au Groupe" et il a commencé à travailler. Je n'ai pas trouvé la raison exacte de cette encore, mais c'perdu la meilleure partie de la journée d'enquête. J'espère que cela aidera quelqu'un d'autre dans l'avenir.
J'ai commencé à avoir des accidents pour
[[NSManagedObjectModel mergedModelFromBundles:nil]
ainsi, sans message d'erreur (type de base de données). J'ai finalement résolu par la prise de conscience que j'avais nommé deux entités dans différents modèles avec le même nom. C'est pourquoi il a été s'écraser pour moi. Changer les noms cessé de s'écraser.