2011-12-08 11 views
10

Tworzę instancję obiektu NSManagedObjectContext na poziomie delegatów aplikacji i udostępniam go wszystkim moim UIViewController s. Oto kod, który używam do niego dostęp w jednym z moim zdaniem kontrolerów:CoreData: Wyczyść zmiany z NSManagedObjectContext

 NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext; 
     modelObj = (Model *) [NSEntityDescription insertNewObjectForEntityForName:@"Model" inManagedObjectContext:[appDelegate managedObjectContext]]; 

Teraz na tym ekranie, mam UITableView z 9 rzędów & każda komórka ma UITextField. Gdy użytkownik wprowadza wartości do pól tekstowych, przypisuję je do modelObj. Teraz mój użytkownik ma opcję anulowania i odrzucenia wszystkich zmian lub zapisania ich na dysku. Mam działający kod zapisu. Ale w przypadku, gdy użytkownik próbuje odrzucić zmiany, nie jestem pewien, co zrobić. Wydaje się, że nie ma metody, aby je wszystkie wyrzucić.

Potrafię wymyślić kilka sposobów rozwiązania tego problemu.

  • Utwórz nową instancję NSManagedObjectContext dla każdego kontrolera zamiast dzielić jedną po drugiej aplikacji.
  • Mogę też utworzyć w moim kodzie kilka NSString s i zapisać w nich wartości użytkownika i zadzwonić pod numer insertNewObjectForEntityForName: tylko wtedy, gdy użytkownik kliknie przycisk Zapisz.

Która droga jest właściwa? Czy jest jakiś sposób, aby odrzucić wszystkie zmiany, które zostały w nim wprowadzone?

Dzięki,
Teja.

+1

Odpowiedź Tim Dean jest poprawna. Ale nie byłoby również niewłaściwym podejściem do tworzenia kontekstu podrzędnego dla tego ekranu edycji, wstawiania tam nowego obiektu i zapisywania go tylko do kontekstu nadrzędnego, jeśli użytkownik je potwierdzi. W przeciwnym razie po prostu wyrzuć dziecko i gotowe. –

Odpowiedz

36

NSManagedObjectContext ma prostego sposobu na to:

[managedObjectContext rollback]; 

Ta metoda „usuwa wszystko z stosu cofania, odrzuca wszystkie wstawki i skreśleń i przywraca aktualizowane obiektów do ich ostatnich wartościach popełnione.” (documentation)

O ile czegoś nie brakuje, to powinno dać ci wszystko, czego potrzebujesz.

+2

Ponieważ pytanie jest oznaczone jako iOS, może być użyteczne wspomnieć, że metoda wycofywania wymaga, aby 'undoManager' został przypisany do MOC, co w przypadku systemu iOS nie jest domyślnie i dlatego' rollback' zrobi nic. –

+1

Oto referencyjny komentarz pomocniczy @ ChristopherKing [docs apple] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/#//apple_ref/occ/instp/NSManagedObjectContext/undoManager). Pamiętaj, aby dodać 'NSUndoManager' do' NSManagedObjectContext', aby mógł on obsługiwać operacje 'cofnij' lub' przywracanie '. –

2

Być może szukasz -refreshObject:mergeChanges: - dokumenty mówią, że resetuje obiekt z magazynu trwałego, a jeśli podasz NO jako drugi argument, możesz zrezygnować z ponownego wprowadzania zmian, które zostały wprowadzone.

Najprawdopodobniej będzie to wymagało zachowania zestawu zmienionych obiektów (dla pierwszego argumentu), a następnie wyczyszczenia tego zestawu po zatwierdzeniu zmian w kontekście dla sklepu. To powinno być jednak całkiem banalnym dodatkiem.

Powiązane problemy