2011-12-08 10 views
10

Sto istanziando un oggetto NSManagedObjectContext a livello di delegato dell'applicazione e condividendolo su tutti i miei UIViewController s. Ecco il codice che uso per accedervi in ​​uno dei miei View Controller:CoreData: Cancella modifiche da NSManagedObjectContext

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

Ora, in questa schermata, ho un UITableView con 9 righe & ogni cella ha una UITextField. Quando l'utente immette i valori nei campi di testo, li assegno a modelObj. Ora, il mio utente ha un'opzione per cancellare e scartare tutte le modifiche o salvarle su disco. Ho il codice di salvataggio che funziona bene. Ma nel caso in cui un utente provi a scartare le modifiche, non sono sicuro di cosa fare. Non sembra essere un metodo [managedObjectContext discardChanges] per buttarli via tutti.

mi viene in mente un paio di modi di risolvere questo.

  • Creare una nuova istanza di NSManagedObjectContext per ciascun controller invece di condividerne uno attraverso l'applicazione.
  • Oppure, potrei creare un gruppo di NSString s nel mio codice e salvare valori utente in esse e chiamare insertNewObjectForEntityForName: solo se l'utente fa clic su Salva.

Quale strada è quella giusta? O c'è un modo per rendere scartare tutte le modifiche che sono state apportate ad esso?

Grazie,
Teja.

+1

La risposta di Tim Dean è corretta. Ma non sarebbe un approccio sbagliato creare un contesto figlio per questa schermata di modifica, inserire il nuovo oggetto lì e salvarlo solo nel contesto genitore se l'utente conferma. Altrimenti, butta via il bambino, e il gioco è fatto. –

risposta

36

NSManagedObjectContext ha un metodo semplice per questo:

[managedObjectContext rollback]; 

Questo metodo "rimuove tutto dal stack di annullamento, scarta tutte le inserzioni e delezioni, e ripristina aggiornato oggetti per i loro ultimi valori impegnati." (documentation)

A meno che non manchi qualcosa, questo dovrebbe darti tutto ciò di cui hai bisogno.

+2

Poiché la domanda è codificata con iOS, potrebbe essere utile menzionare che il metodo di rollback richiede che un "undoManager" sia assegnato al MOC, che nel caso di iOS credo non sia di default e quindi "rollback" farà Niente. –

+1

Ecco il riferimento che supporta il commento di @ ChristopherKing [apple docs] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/#//apple_ref/occ/instp/NSManagedObjectContext/UndoManager). Assicurati di aggiungere un 'NSUndoManager' al tuo' NSManagedObjectContext' perché supporti le operazioni 'annulla' o' rollback'. –

2

Si potrebbe cercare -refreshObject:mergeChanges: - i documenti dicono che reimposta un oggetto dall'archivio permanente e se si passa NO come secondo argomento, è possibile scegliere di non riapplicare le modifiche apportate.

Probabilmente sarà necessario memorizzare un set di oggetti che sono stati modificati (per il primo argomento), quindi deselezionare quell'insieme quando si commettono modifiche nel proprio contesto allo store. Questa dovrebbe essere un'aggiunta piuttosto banale, però.

Problemi correlati