Tengo un principal NSManagedObjectContext que se crea en la appDelegate.

Ahora, estoy usando otro NSManagedObjectContext para la edición/agregar nuevos objetos sin afectar a los principales NSManagedObjectContext, hasta que me los guarde.

Cuando me guarde el segundo NSManagedObjectContext, los cambios no se reflejan en los principales NSManagedObjectContext, sin embargo, si abro el .base de datos sqlite en el simulador, los cambios han sido guardados correctamente en el dispositivo .base de datos sqlite. No importa si puedo recuperar los datos de nuevo, o incluso si puedo crear un tercer NSManagedObjectContext, no puedo ver los cambios a partir de la segunda NSManagedObjectContext, a pesar de los cambios que realmente existen en el disco en este momento.

Si puedo salir y volver a abrir la aplicación, todos los cambios están ahí.

Lo que puede causar que el principal NSManagedObjectContext para no ver los nuevos cambios presentes en el almacén persistente?

Antes de que este enfoque, yo estaba usando un solo NSManagedObjectContext y undoManager, pero yo quería cambiar el uso de dos diferentes NSManagedObjectContexts.

La segunda NSManagedObjectContext guardar:

    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]);
        }
    }

OriginalEl autor mongeta | 2011-05-27

1 Comentario

  1. 27

    Si aún no lo has hecho, te sugiero la lectura de la documentación de Apple en Datos Básicos : La Gestión Del Cambio.

    Deberá notificar a la primera contexto de los cambios que fueron salvados a través de la segunda contexto. Al guardar un contexto, la publica en un NSManagedObjectContextDidSaveNotification. Registro de notificación. En el método de controlador, se funden en el contexto de los cambios se guardan a través de la segunda contexto. Por ejemplo:

    //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];

    Controlador de notificación:

    - (void)handleDidSaveNotification:(NSNotification *)note {
        [firstManagedObjectContext mergeChangesFromContextDidSaveNotification:note];
    }
    Pensé que el NSManagedObjectContextDidSaveNotification no era necesario/obligatorio, he leído otros posts y que no estaba claro para mí. Voy a probar lo que usted sugiere y post aquí de nuevo. Gracias!
    gracias, funciona a la perfección!
    eres bienvenido!
    +1! También hay un buen artículo sobre cocoanetics explicando cómo trabajar con múltiples contextos y datos básicos que vale la pena leer cocoanetics.com/2012/07/multi-context-coredata
    handleDidSaveNotification puede ser evitado, y en lugar de sólo añadir el observador en firstManagedObjectContext, …addObserver: firstManagedObjectContext selector:@selector(mergeChangesFromContextDidSaveNotification:)…

    OriginalEl autor octy

Dejar respuesta

Please enter your comment!
Please enter your name here