Modifiche salvate da un NSManagedObjectContext non riflettere sulle principali NSManagedObjectContext

Ho un principale NSManagedObjectContext creata in appDelegate.

Ora, sto usando un altro NSManagedObjectContext per la modifica/aggiunta di nuovi oggetti, senza intaccare il principale NSManagedObjectContext, fino a quando ho salvarli.

Quando salvo il secondo NSManagedObjectContext, le modifiche non vengono applicate nei principali NSManagedObjectContext, ma se apro il .database sqlite simulatore, le modifiche sono state salvate correttamente nel .database sqlite. Non importa se è possibile recuperare i dati, o anche se creo un terzo NSManagedObjectContext, non riesco a vedere le modifiche da seconda NSManagedObjectContext, nonostante il fatto che tali modifiche non esistono effettivamente sul disco, a questo punto.

Se devo chiudere e riaprire l’app, tutti i cambiamenti ci sono.

Quale può essere la causa principale NSManagedObjectContext per non vedere le nuove modifiche presenti in un archivio permanente?

Prima di questo approccio, io sto usando un singolo NSManagedObjectContext e undoManager, ma io volevo cambiare l’uso di due diversi NSManagedObjectContexts.

Il secondo NSManagedObjectContext salva:

    NSError* error = nil;

    if ([managedObjectContext hasChanges]) {
        NSLog(@"This new object has changes");
    }

    if (![managedObjectContext save:&error]) {
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0) {
            for(NSError* detailedError in detailedErrors) {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
            }
        }
        else {
            NSLog(@"  %@", [error userInfo]);
        }
    }
InformationsquelleAutor mongeta | 2011-05-27



One Reply
  1. 28

    Se non l’hai già fatto, vi suggerisco di leggere la documentazione di Apple su Dati Fondamentali : La Gestione Del Cambiamento.

    È necessario notificare il primo contesto dei cambiamenti che sono stati salvati, mediante la seconda del contesto. Durante il salvataggio di un contesto, invia un NSManagedObjectContextDidSaveNotification. Registro per la notifica. Nel metodo del gestore, si fondono in un primo contesto le modifiche salvate attraverso il secondo contesto. Per esempio:

    //second managed object context save
    
    //register for the notification
    [[NSNotificationCenter defaultCenter] 
        addObserver:self 
           selector:@selector(handleDidSaveNotification:)
               name:NSManagedObjectContextDidSaveNotification 
             object:secondManagedObjectContext];
    
    //rest of the code ommitted for clarity
    if (![secondManagedObjectContext save:&error]) {
        //...
    }
    
    //unregister from notification
    [[NSNotificationCenter defaultCenter] 
        removeObserver:self 
                  name:NSManagedObjectContextDidSaveNotification 
                object:secondManagedObjectContext];

    Gestore di notifica:

    - (void)handleDidSaveNotification:(NSNotification *)note {
        [firstManagedObjectContext mergeChangesFromContextDidSaveNotification:note];
    }
    • Ho pensato che la NSManagedObjectContextDidSaveNotification non era necessario/obbligatorio, ho letto altri post e che non era chiaro per me. Proverò quello che vi suggeriamo qui e post nuovo. Grazie!
    • +1! Inoltre c’è un buon articolo su cocoanetics che spiega come lavorare con più contesti e di dati di base che vale la pena di leggere cocoanetics.com/2012/07/multi-context-coredata
    • handleDidSaveNotification possono essere evitati, e invece basta aggiungere l’osservatore sulla firstManagedObjectContext, …addObserver: firstManagedObjectContext selector:@selector(mergeChangesFromContextDidSaveNotification:)…
    • Funziona perfettamente anche con un privateQueueConcurrencyType. Grazie

Lascia un commento