12
votes

Données de base: réinitialiser à l'état initial

J'ai un objet, je m'apporte quelques modifications, mais je ne veux pas les sauver, je veux les "vieilles" valeurs.

J'ai essayé avec: P>

NSLog(@"current: %@",ingredient.name); // ===> bread
[ingredient setName:@"test new data"];
NSLog(@"new: %@",ingredient.name); // ===> test new data

[managedObjectContext rollback];
[managedObjectContext redo];
[managedObjectContext reset];

NSLog(@"current: %@",ingredient.name); // ===> test new data

// I want again ===> bread


1 commentaires

Oui, voir la réponse acceptée de Marcs S.Zarra


3 Réponses :


3
votes

Essayez [GestionEdObjectContext RefreshObject: Ingrédient Mergechanges: Non] Avant le deuxième NSLOG appel.


0 commentaires

25
votes

Enveloppez vos modifications dans un Nsundomanager Bottomundogrouping code>, puis un Nsundomanager Endundogrouping code> suivi d'un Nsundomanager annuler code>.

C'est la bonne façon faire rouler des changements. Le nsmanagedObjectContext code> a son propre nsundomanager code> que vous pouvez accéder. P>

mise à jour montrant l'exemple h2>

parce que le nsundomanager est nulle par défaut sur COCOA Touch, vous devez créer une et le définir dans le nsmanagedObjectContext d'abord code> sort>. p>

//Do this once per MOC
NSManagedObjectContext *moc = [self managedObjectContext];
NSUndoManager *undoManager = [[NSUndoManager alloc] init];
[moc setUndoManager:undoManager];
[undoManager release], undoManager = nil;

//Example of a grouped undo
undoManager = [moc undoManager];
NSManagedObject *test = [NSEntityDescription insertNewObjectForEntityForName:@"Parent" inManagedObjectContext:moc];
[undoManager beginUndoGrouping];
[test setValue:@"Test" forKey:@"name"];
NSLog(@"%s Name after set: %@", __PRETTY_FUNCTION__, [test valueForKey:@"name"]);
[undoManager endUndoGrouping];
[undoManager undo];
NSLog(@"%s Name after undo: %@", __PRETTY_FUNCTION__, [test valueForKey:@"name"]);


12 commentaires

Cela ne fonctionne pas avec votre suggestion, c'est sûr que je fais quelque chose de mal ... Undomanager = [[[Nsundomanager Alloc] init]; [Undomanager Bottomundogrouping]; Nslog (@ "actuel:% @", ingrédient.name); [INGRÉDIENT SETNAME: "Testez de nouvelles données"]; Nslog (@ "nouveau:% @", ingrédient.name); [endomagnant endundogrouping]; [Undomanager annuler]; Nslog (@ "actuel:% @", ingrédient.name); merci r.


En outre, en utilisant le Nsundo de l'ingrédient NsmanagedObjectModel, ne fonctionne toujours pas ... merci, r.


OK merci! La clé était la suivante: [[Ingrédient GestiondObjectContext] Seturndomanager: Undomanager];


Ne pas être OCD mais vous devriez être autorisé le gestionnaire d'annulation.


Je vois des documents Apple Pourquoi la réinitialisation n'a pas fonctionné: il efface les objets gérés afin que vous ne soit même pas destiné à conserver des références. Mais pourquoi ne pas rollback? N'est-il pas fait pour cela?


Il peut être utilisé oui. Mais c'est une sorte de Nuke de l'approche de type orbite :)


Salut Marcus, pouvons-nous revenir aux changements après avoir enregistré un contexte d'objet géré?


Non, une fois que les modifications sont enregistrées du contexte, ce contexte efface la pile d'annulation qu'il a fait référence à.


Donc, si un UIManageDDocument a-t-il une sauvegarde automatique dans vous êtes vissé? Par exemple, si vous souhaitez rétablir des modifications apportées dans un contexte enfant lorsque l'utilisateur tapote-t-il au lieu de sauvegarder?


Pas nécessairement. Cela dépend de la manière dont vous êtes configuré au-dessus de l'UIManageDDocument. Si vous avez un enfant MOC, par exemple, vous contrôlez la sauvegarde sur cet enfant MOC. Si vous travaillez strictement avec le MOC à l'intérieur de l'UIManageDDocument, alors oui, c'est un risque.


D'accord, mais depuis que je reçois deux contextes de l'UimanageDDocument du début de celui d'un enfant, et que ce contexte enfant est réellement enregistré automatiquement, je viens de supposer que l'opération de sauvegarde automatique s'est propagée dans l'arbre des contextes. Ce n'est pas comme ça que ça marche alors?


Tout d'abord, ne touchez jamais le contexte privé dans un uimanagedDocument. Par la spécification qui est privée. Deuxièmement, les sauvegardes se propagent jusqu'au contexte privé mais non à aucun des enfants du contexte exposé.



4
votes

Selon la documentation d'Apple

Utiliser P>

- (void)rollback; 
[managedObjectContext rollback];


0 commentaires