2010-02-22 3 views
0

J'écris une application iPhone qui va chercher un fichier XML, l'analyse, puis enregistre les objets analysés dans les données de base. Tout fonctionne jusqu'au point où j'enregistre les objets dans Core Data. J'imagine que cela a quelque chose à voir avec la façon dont je référence le ManagedObjectContext mais je n'arrive pas à comprendre où je vais mal. J'ai regardé le SO question here mais je suis toujours perplexe. J'ai suivi le Core Data Tutorial for iPhone et j'ai réussi, mais j'ai l'impression d'avoir rencontré un problème en appliquant ce que j'ai appris à mon propre projet. Mon application est différente dans la structure de l'exemple dans le tutoriel.Comment puis-je donner mon code d'accès à mon ManagedObjectContext?

Mon application est un UITabBar avec trois sous-vues, appelons-les A, B et C et un fichier de classe distinct qui est juste utilisé pour extraire le XML appelé XMLParser. Cette classe de récupération XML est appelée en appuyant sur un bouton dans ViewController 'C'.

Lorsque j'analyse le code XML, j'essaie de sauvegarder les objets analysés à la volée dans les données de base. Il échoue à la première tentative avec l'erreur suivante:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 
'+entityForName: could not locate an NSManagedObjectModel for entity name 'Branch'' 

Dans mon délégué app, je le code suivant relatif à ma classe xmlparser:

En haut du fichier AppDelegate.m

#import "XMLParser.h" 

intérieur applicationDidFinishLaunching

NSManagedObjectContext *context = [self managedObjectContext]; 
XMLParser *xmlparser = [[XMLParser alloc] init]; 
xmlparser.managedObjectContext = context; 
[xmlparser release]; 

Au lieu de coller chun massif ks de code dans la question en ce moment, si quelqu'un peut voir quelque chose avec ce que j'ai écrit jusqu'ici alors s'il vous plaît demander plus de code ou une meilleure explication.

Edit: J'ai vérifié tout dans la réponse acceptée pour this SO question et j'ai tout cela configuré

Merci


EDIT

je me rends compte maintenant que parce que j'instancier en fait un objet XMLParser sur pression d'un bouton dans ViewController C, l'ensemble managedObjectContext dans applicationDidFinishLaunching ne s'applique pas à l'objet nouvellement instancié. Alors, comment donner l'accès XMLParser à mes applications ManagedObjectContext lorsque je l'instancie après avoir appuyé sur le bouton sur mon ViewController?

Répondre

1

Vous créez un objet XMLParser et définissez son contexte d'objet géré. C'est bon.

Cependant, vous le libérez. Si vous prévoyez d'utiliser l'objet, vous ne devez pas le libérer immédiatement.

MISE À JOUR
Vous pouvez passer le contrôleur contexte de l'objet géré dans votre vue (s) dans applicationDidFinishLaunching:. Vous pouvez également l'obtenir du délégué de l'application ou d'un autre singleton qui gère votre pile de données de base.

Vous pouvez obtenir le contexte de l'objet géré par le délégué de l'application comme ceci:

[UIApplication sharedApplication].delegate.managedObjectContext 
+0

@ gerry3 Je vois ce que tu veux dire, je pensais qu'il était étrange aussi, mais c'est ce que le tutoriel Apple ne aussi, voir ici (http://developer.apple.com/IPhone/library/documentation/DataManagement/Conceptual/iPhoneCoreData01/Articles/02_RootViewController.html#//apple_ref/doc/uid/TP40008305-CH104-SW11) – conorgriffin

+0

Ce n'est pas ce que dit le didacticiel. Votre analyseur n'analysera pas tant que vous n'aurez pas envoyé le message d'analyse. En effet, vous avez créé un analyseur, puis l'avez libéré sans rien faire. – Giao

+0

OK, je pense qu'il y a un problème séparé ici. Maintenant, j'ai pris du recul, je me rends compte que l'analyseur que j'instancie dans applicationDidFinishLaunching, et dont j'ai défini le managedObjectContext, n'est pas la même instance que celle qui sera appelée plus tard en appuyant sur un bouton de ViewController C Parce que, sur pression de ce bouton, j'instancie un nouvel objet. Je vais mettre à jour la question – conorgriffin

Questions connexes