2010-04-22 3 views
1

Ceci est un suivi de mes problèmes précédents here. Réinitialiser le simulateur résolu tous mes problèmes avant, et je suis allé pour compléter mon App.coredata en utilisant l'ancienne version du fichier sur l'appareil

J'ai maintenant exactement le même problème lors de l'installation de l'application sur mon appareil iPhone. Il ramasse une ancienne version de ma base de données, qui ne dispose pas de la seconde entité, et se bloque lorsque je tente d'accéder à la seconde entité:

2010-04-22 23:52:18.860 albumCloud[135:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'Image'' 
2010-04-22 23:52:18.874 albumCloud[135:207] Stack: (
    843263261, 
    825818644, 
    820669213, 
    20277, 
    844154820, 
    16985, 
    14633, 
    844473760, 
    844851728, 
    862896011, 
    843011267, 
    843009055, 
    860901832, 
    843738160, 
    843731504, 
    11547, 
    11500 
) 

terminate called after throwing an instance of 'NSException' 

J'ai deux questions:

1) Comment diable puis-je supprimer mon application suffisamment de mon téléphone pour supprimer les anciennes données? (J'ai jusqu'ici essayé la suppression d'application régulière, supprimant et maintenant la maison et l'alimentation pour un redémarrage, maudissant et menaçant l'application tout en l'exécutant ... tout)

2) Comment puis-je empêcher cela se produit lorsque mon application est dans l'App Store, et je pour une raison quelconque décider que je veux ajouter une autre entité au magasin, ou un autre attribut aux entités existantes? Y a-t-il une méthode "si x n'existe pas alors créez-le"?

Répondre

1

Pour supprimer complètement l'application, supprimez-la par la méthode habituelle, c'est-à-dire maintenez-la enfoncée jusqu'à ce qu'elle se tortille et appuyez sur le bouton Supprimer. Ensuite, connectez-vous à iTunes. Il se peut qu'iTunes restaure l'application et ses données sauvegardées à chaque fois.

Pour soutenir l'ajout de nouvelles entités plus tard, vous souhaitez utiliser le versionnage et la migration automatique léger qui est décrit ici:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweight.html#//apple_ref/doc/uid/TP40008426-SW1

Fondamentalement, vous créez une nouvelle version de votre modèle de données en utilisant le Design->Data Model menu dans Xcode (Editeur -> "Ajouter une version du modèle" dans Xcode 4), puis apporter quelques modifications au code. Les données de base migreront automatiquement un ancien modèle vers le plus récent. Vous êtes limité dans les types de changements que vous pouvez faire. Vous pouvez ajouter de nouvelles entités et ajouter un attribut facultatif aux entités existantes ou des attributs obligatoires avec des valeurs par défaut définies. Une chose qui m'a attrapé, c'est que la façon dont vous chargez les données de base NSManagedObjectModel change lorsque vous souhaitez utiliser la gestion des versions et la migration. Sans migration, vous avez probablement ceci:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil]; 

Une fois que vous commencez à utiliser le versioning et la migration cela doit changer quelque chose comme ceci:

NSString *path = [[NSBundle bundleForClass:self.class] pathForResource:@"DataModelName" 
                   ofType:@"momd"]; 
NSURL *url = [NSURL fileURLWithPath:path]; 
NSManagedObjectModel *model = [[[NSManagedObjectModel alloc] initWithContentsOfURL:url] autorelease]; 
+0

Merci beaucoup, cela est allé dans ma liste de liens pour regarder au moment où j'ai fini d'écrire et de tester. –

+0

"Pour supprimer complètement l'application, supprimez-la par la méthode habituelle, c'est-à-dire maintenez jusqu'à ce qu'elle se tortille et appuyez sur le bouton Supprimer." Je pensais que cela devrait fonctionner aussi, mais en me basant sur les erreurs Core Data que je reçois sur l'appareil, cela ne semble pas effacer l'ancienne base de données. Est-ce possible que l'ancienne base de données ne soit pas supprimée lorsque l'application est supprimée? –

Questions connexes