2010-06-03 4 views
3

Je suis en train d'implémenter un mécanisme annuler/rétablir dans mon application. Cela fonctionne bien pour beaucoup de cas. Cependant, je ne peux pas annuler passé deleteObject :. l'objet est correctement enregistré dans la file d'attente d'annulation, et je le récupère et réinscrit dans la pile de données de base très bien quand j'appelle l'annulation. Le problème est que tous ses attributs sont mis à zéro quand je le supprime.Données de base deleteObject: définit les attributs à zéro

J'ai une entité "Canvas" avec une relation to-many appelée "graphics" à une entité "Graphic", dont l'inverse est "canvas". Supprimer un graphique, puis l'insérer à nouveau, ne fonctionne pas. Voici le code (la méthode redo est fondamentalement la même):

- (void)deleteGraphic:(id)aGraphic { 
//NSLog(@"undo drawing"); 
//Prepare the undo/redo 
[self.undoManager beginUndoGrouping]; 
[self.undoManager setActionName:@"Delete Graphic"]; 

[[self.detailItem valueForKey:@"graphics"] removeObject:aGraphic]; 
[[self managedObjectContext] deleteObject:aGraphic]; 

//End undo/redo 
[self.undoManager registerUndoWithTarget:self selector:@selector(insertGraphic:) object:aGraphic]; 
[self.undoManager endUndoGrouping]; 

NSLog(@"graphics are %@", [self sortedGraphics]); 

//Update drawing 
[self.quartzView setNeedsDisplay]; 
} 

et voici le wierdness:

Avant de suppression:

graphics are (
<NSManagedObject: 0x1cc3f0> (entity: Graphic; id: 0x1c05f0 <x-coredata:///Graphic/t840FE8AD-F2E7-4214-822F-7994FF93D4754> ; data: { 
canvas = 0x162b70 <x-coredata://A919979E-75AD-474D-9561-E0E8F3388718/Canvas/p20>; 
content = <62706c69 73743030 d4010203 04050609 0a582476 65727369 6f6e5424 746f7059 24617263 68697665 7258246f 626a6563 7473>; 
frameRect = nil; 
label = nil; 
order = 1; 
path = "(...not nil..)"; 
traits = "(...not nil..)"; 
type = Path; 
}) 

Après redo:

graphics are (
<NSManagedObject: 0x1cc3f0> (entity: Graphic; id: 0x1c05f0 <x-coredata:///Graphic/t840FE8AD-F2E7-4214-822F-7994FF93D4754> ; data: { 
canvas = nil; 
content = nil; 
frameRect = nil; 
label = nil; 
order = 0; 
path = nil; 
traits = nil; 
type = nil; 
}), 

Vous peut voir que c'est le même objet, totalement blanchi par Core Data. La relation delete rouls n'a apparemment rien à voir avec ça puisque je les ai mis à "No Action" dans un test.

Répondre

2

Eh bien, je ne suis pas satisfait de la correction, mais une façon consiste à effectuer une [sauvegarde moc] sur le contexte avant de supprimer l'objet. Malheureusement, dans les situations d'annulation/rétablissement, cela signifie que je dois sauvegarder après chaque opération, ce qui est sous-optimal mais corrige ce problème.

+0

Bonne réponse! J'ai passé d'innombrables heures à essayer de déboguer la situation inverse: je voulais défaire un objet que j'avais inséré, et il revenait vide. L'enregistrement du contexte avant l'insertion de l'objet a sauvé le problème. Bizarre mais fonctionne. –

Questions connexes