2009-10-25 2 views
9

Je travaille sur une application qui effectuera une recherche sur un service en ligne et générera de nombreux objets Result. Un objet Result est un objet NSManagedObject, initialisé comme requis en l'associant à un objet NSManagedObjectContext.Comment puis-je créer de nombreux objets temporaires, puis n'en enregistrer qu'un en utilisant les données de base?

Les utilisateurs doivent pouvoir sélectionner un "Résultat" et l'enregistrer en tant que "Favori". Dans l'application, ceci est aussi simple que d'associer l'entité Résultat à une nouvelle entité Favorite et de sauvegarder le contexte.

Le problème est que chaque résultat dans le contexte est bien sûr enregistré dans la base de données avec celui que je veux.

J'ai vu de nombreux exemples d'utilisation de plusieurs instances de NSManagedObjectContext pour gérer diverses situations de création et de persistance. Tous semblent tourner autour de l'idée de créer de nouvelles instances avec un Contexte, puis de les fusionner dans un autre contexte afin d'éviter une autre exécution de FetchRequest. Ces exemples ne résolvent pas le problème car ils conduisent toujours à l'enregistrement de chaque entité Résultat.

Quelqu'un a des suggestions? Je suis totalement épuisé à ce sujet.

Répondre

5

Vous devez utiliser un contexte différent pour chaque objet. L'utilisation d'un contexte d'objet géré distinct vous permet de travailler comme suit. Lorsque l'utilisateur sélectionne son objet favori, il vous suffit de supprimer les contextes liés aux objets de résultat restants. Pas besoin de fusionner les changements, etc. Il y a fondamentalement un compromis. Vous finissez par gérer (créer/rejeter) plusieurs contextes, mais ensuite vous réalisez votre objectif facilement. Sinon, vous pouvez toujours le faire en utilisant un seul contexte. Cependant, vous devez explicitement insérer ou supprimer chaque objet comme indiqué dans les extraits de code suivants.

essayer. Seulement pour l'objet favori que vous souhaitez enregistrer, procédez comme suit:

[managedObjectContext insertObject:theFavorite]; 

Pour chacun des autres objets de résultat faire à la place:

[managedObjectContext deleteObject:aResult]; 

puis enregistrez comme d'habitude

NSError *error = nil 
if (![managedObjectContext save:&error]) { 
    // Handle error 

} 

Cela économisera seulement votre objet favori sélectionné.

+0

Nous y sommes allés avec la première partie de votre réponse. Nous utilisons un graphique Contexte par objet et nous l'enregistrons au besoin. – user174448

3

Créer des objets Result qui ne sont pas des sous-classes NSManagedObject. Lorsque l'utilisateur en choisit un, créez une seule instance gérée et enregistrez-la.

+0

Je simplifiais le problème par souci de concision. L'objet Résultat est une entité avec de nombreuses propriétés et plusieurs relations. La pensée de dupliquer les classes me fait vomir dans ma bouche :) – user174448

4

Je préfère utiliser un contexte NIL et avoir une classe de modèle de domaine de base pour gérer de façon récursive l'ajout d'objets à un contexte valide lorsque je veux les conserver. Il fonctionne vraiment bien (et proprement!) ... code disponible ici ... Temporary Core Data

+0

C'est la bonne solution pour l'objet temp. Cependant, que se passe-t-il lorsque vous ajoutez un objet à un ensemble de relations qui a * un * contexte? Quelle est la meilleure approche ici? –

+0

Voir aussi cette question: http://stackoverflow.com/questions/3256195/how-to-deal-with-temporary-nsmanagedobject-instances – Symmetric

Questions connexes