2009-10-03 7 views
4

Dans un projet Core Data, j'ai deux boutons sur mon interface (une table), un qui édite les données sur une personne et les enregistre sur la db, et l'autre vous permet de manipuler visuellement les données sans les sauvegarder à la DB. Comment puis-je 'détacher' l'objet de données de base, de sorte qu'il n'écrive pas de données sur la base de données? J'ai essayé d'écrire une nouvelle classe NSObject qui imite la classe NSManagedObject, puis déplace les données dans la classe NSObject, mais elle change toujours la base de données db!Comment détacher un objet géré des données de base?

//button for editing and saving 
PersonObj *person = (PersonObj *)[fetchedResultsController objectAtIndexPath:indexPath]; 
PersonEditViewController *editViewController = [[PersonEditViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
// puts the managed object into the new view controller 
editViewController.person = person; 
[self.viewController pushViewController:editViewController animated:animated]; 
[editViewController release]; 

//button for editing and NOT saving 
PersonObj *person = (PersonObj *)[fetchedResultsController objectAtIndexPath:indexPath]; 
PersonFiddlingViewController *fiddling = [[PersonFiddlingViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
// move db data into non-db class??? not working 
fiddling.eyeColor = person.eyeColor; 
fiddling.name = person.name; 
[self.viewController pushViewController:fiddling animated:animated]; 
[fiddling release]; 

Répondre

0

Je n'ai utilise des données de base pour quelques jours maintenant (juste converti un projet à l'utiliser pour stocker les données utilisateur), mais ce que vous décrivez n'a pas de sens. Comment le magasin de sauvegarde (db) peut-il enregistrer les modifications, sauf si vous validez les modifications en utilisant NSManagedObjectContext:save: quelque part? Pouvez-vous poster votre code là où vous appelez cette méthode? Peut-être que vous le faites à tort dans un autre contexte (peut-être viewDidLoad: ou quelque chose comme ça).

2

Je ne pense pas que vous compreniez le fonctionnement du CD. Vous ne pouvez pas détacher un objet de CoreData, CD est le magasin de sauvegarde de l'objet.

Je suis également assez certain que les problèmes que vous voyez ne sont pas liés au code que vous avez inclus ci-dessus, car même dans le premier cas, il n'y a rien dans le code qui valide les changements au stockage persistant. Absent un appel à NSManagedObjectContext:save: tous les changements à votre graphique d'objet seront transitoires. En d'autres termes, pour faire ce que vous voulez faire (modifier les choses sans les sauvegarder), n'appelez pas save: sur le contexte dans lequel se trouve l'objet après l'avoir modifié. Si vous devez enregistrer d'autres modifications que vous pouvez rouler explicitement revenir les réglages avant la sauvegarde, ou vous pouvez envelopper les objets retouchés dans leur propre contexte avant de jongler avec eux:

NSManagedObjectContext *tweakingContext = [[NSManagedObjectContext alloc] init]; 
tweakingContext.persistentStoreCoordinator = person.managedObjectContext.persistentStoreCoordinator; 
PersonObj *tweakablePerson = [tweakingContext objectWithID:person.managedObjectID]; 

//Do your stuff 

[tweakingContext release]; 

Le code ci-dessus vous vous donner une nouvelle object (tweakablePerson) qui est en défaut à partir des mêmes données que la personne, mais dans un contexte indépendant, vous ne sauvegarderez jamais. Si vous voulez toujours l'enregistrer, vous pouvez le faire, mais vous devrez faire face à d'autres problèmes (conflits d'enregistrement potentiels si d'autres sauvegardes ont eu lieu). Encore une fois, bien que cela réponde à la question que vous posez, je ne pense pas que cela résoudra votre problème car le problème ne se trouve certainement pas dans le code de création d'objets ou de fetch (que vous montrez), mais dans le code de sauvegarde que vous n'avez pas répertorié.

Questions connexes