2010-02-12 6 views
1

J'ai besoin de quelques conseils sur la façon de procéder:Problème de stratégie: Récupération de données à partir de XML pour mettre à jour la base de données de base de données locale?

1) Je récupère un XML à partir d'un serveur Web.

2) Je veux stocker toutes les entités (c'est-à-dire les amis) de ce XML localement sur l'appareil, en utilisant des données de base.

3) Je parse le XML et faire dans ce XML

4) un objet géré pour chaque ami, mais je veux vous assurer que je ne pas ajouter un ami à plusieurs reprises dans le DB. Comment pourrais-je réaliser cela?

-------------- mes pensées stratégiques sur ce ----------------

A) lors de l'analyse du XML, Je crée un objet géré de l'entité Ami dès qu'un élément Ami est démarré. À ce stade, je ne sais pas quel ami il sera, jusqu'à ce que le NSXMLParser passe par tous les attributs à venir comme prénom, id, etc .; Après l'étiquette de fin pour l'élément ami, j'ai cet ami dans mon contexte d'objet géré. Ensuite, je fais un NSFetchRequest pour voir si cet ami est déjà stocké. Le problème est, que le nouvel ami fait déjà partie du contexte, donc Core Data retournera toujours un match !? B) J'ai besoin de deux contextes d'objets gérés différents pour que les amis analysés entrent d'abord dans MOC_A, puis interroge MOC_B (le magasin local réel) sans que les nouveaux amis analysés ne déplacent ma requête vers le magasin local. Je peux donc savoir si l'ami existait déjà. C) Pendant l'analyse d'un ami à partir du XML, je crée simplement une nouvelle instance d'objet géré SANS l'ajouter à un contexte d'objet géré (possible?!). Plus tard, lorsque l'ami est complètement pares, je vérifie les données de base s'il est stocké. Sinon, je l'ajoute. Sinon, je jette l'objet.

D) J'ai besoin d'une autre stratégie.

+0

Vous avez posé cette question plusieurs fois maintenant de différentes façons. La réponse consiste à utiliser un nouvel attribut indexé dans votre entité Core Data pour stocker l'ID unique à partir du XML. Avant d'ajouter un objet, vous devrez vérifier manuellement si un objet avec cet ID existe déjà. – gerry3

+1

Probablement, je le demande de différentes façons, parce que je n'ai pas de réponse utile jusqu'à présent. Celui-ci n'est pas utile non plus. Je ne sais pas ce que vous essayez de dire. Soyez plus détaillé, s'il vous plaît. Comme je l'ai demandé (et plus récent a obtenu une réponse à), le problème est que mon nouvel objet analysé vit dans le contexte, et donc l'interrogation des données de base entraînerait probablement une correspondance. S'il vous plaît lisez mes questions complètement avant de les voter. – dontWatchMyProfile

+0

Maintenant que vous avez ajouté de nouvelles informations, cela a plus de sens. Cependant, vous auriez pu ajouter cette information à l'une ou l'autre des autres questions. – gerry3

Répondre

3

Vous devez utiliser un nouvel attribut indexé dans votre entité Données de base pour stocker l'ID unique à partir du XML. Avant d'ajouter un objet, vous devrez vérifier manuellement si un objet avec cet ID existe déjà.

MISE À JOUR
La clé est de ne pas ajouter un objet géré au contexte jusqu'à ce que vous avez déterminé qu'il est nouveau.
C'est assez simple étant donné l'ID unique, mais il semble que vous ne puissiez pas analyser l'ID unique en premier. Dans ce cas, vous devez utiliser un dictionnaire temporaire modifiable (NSMutableDictionary) pour stocker les données lors de leur analyse.
Si vous déterminez que l'ami est nouveau, vous pouvez le créer et copier les données du dictionnaire. Si l'ami n'est pas nouveau, vous pouvez supprimer le dictionnaire.

+0

Eh bien, vous n'y avez pas vraiment répondu: Le problème est que l'objet géré est créé dès que NSXMLParser correspond au début d'un nouvel objet, et que MO va directement dans le contexte de l'objet géré. Et puis, la question est toujours ouverte: Si elle vit déjà dans le contexte, comment puis-je: a) interroger en toute sécurité les données de base si elles existent (c'est le cas, dans le contexte!), b) jeter cet objet en toute sécurité si l'un de ses objets est> stocké dontWatchMyProfile

+0

J'ai mis à jour ma réponse compte tenu des nouvelles informations. Idéalement, vous seriez en mesure d'analyser l'ID unique en premier et d'effectuer la vérification immédiatement. Si ce n'est pas possible, je suggère d'utiliser un dictionnaire temporaire. Faites-moi savoir si vous avez des questions sur cette approche. – gerry3

+0

Merci pour la mise à jour, mon pote. Maintenant, cela a du sens :). Bon, alors disons que je ne peux pas ajouter cela dans le MOC dès que l'analyseur y intervient. Ne pourrais-je pas simplement instancier la classe personnalisée pour cet objet géré, disons 'amis', et remplir les propriétés si nécessaire? Un problème que je vois est que les propriétés sont "dynamiques", et je crois que Core Data les crée. Mais dans ce cas, Core Data ne ferait rien en premier lieu, donc je ne peux pas utiliser cette classe pour les objets temporaires à moins que je ne la modifie profondément -> pourrais-je la modifier sans interrompre les données de base? Pourrais-je ajouter des variables d'instance? – dontWatchMyProfile

Questions connexes