2011-05-27 11 views
13

Tengo un NSManagedObjectContext principal que se creó en la aplicaciónDelegate.Los cambios guardados de un NSManagedObjectContext no se reflejan en el NSManagedObjectContext principal

Sepa, estoy usando otro NSManagedObjectContext para editar/agregar objetos nuevos sin afectar el NSManagedObjectContext principal, hasta que los guarde.

Cuando guardo el segundo NSManagedObjectContext, los cambios no se reflejan en el NSManagedObjectContext principal, pero si abro la base de datos .sqlite del simulador, los cambios se guardaron correctamente en la base de datos .sqlite. No importa si recupero los datos, incluso si creo un tercer NSManagedObjectContext, no puedo ver los cambios desde el segundo NSManagedObjectContext, pero esos cambios están en el disco en este momento ...

Si salgo y abro la aplicación, todos los cambios están ahí.

¿Qué puede hacer que el NSManagedObjectContext principal no vea los nuevos cambios de la tienda?

Antes de este enfoque, estaba usando el mismo NSManagedObjectContext y undoManager, pero quiero cambiarlo para usar dos NSManagedObjectContext diferentes.

gracias,

m.

second NSManagedObjectContext save: 
----------------------------------------- 

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

Respuesta

26

Si no lo ha hecho, sugiero la lectura de la documentación de Apple en Core Data : Change Management.

Es necesario notificar al primer contexto de los cambios que se han guardado a través del segundo contexto. Al guardar un contexto, publica un NSManagedObjectContextDidSaveNotification. Registrarse para esa notificación. En el método del controlador, combine en el primer contexto los cambios guardados en el segundo contexto. Por ejemplo: manejador

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

Notificación:

- (void)handleDidSaveNotification:(NSNotification *)note { 
    [firstManagedObjectContext mergeChangesFromContextDidSaveNotification:note]; 
} 
+0

pensé que el NSManagedObjectContextDidSaveNotification no era necesario/obligatoria, he leído otros puestos y que no estaba claro para mí. Voy a intentar lo que sugieres y publicar aquí de nuevo. ¡Gracias! – mongeta

+1

gracias, funciona a la perfección! – mongeta

+0

¡De nada! – octy

Cuestiones relacionadas