2010-07-30 23 views
5

Estoy desarrollando un sistema de copia de seguridad/restauración para mi aplicación en el que el usuario puede descargar una copia de seguridad del almacén de datos principal (archivo sqlite) y reemplazar el almacén de datos actualmente utilizado con el archivo descargado. Sin embargo, una vez que el usuario descarga el archivo y reemplaza el almacén de datos actual, parece que ninguno de los datos se actualizó. Pero cuando se cierra de nuevo la aplicación &, los datos restaurados están disponibles. ¿Cómo puedo forzar que mi aplicación vuelva a cargar el archivo del almacén de datos central?Reemplazo del archivo sqlite Core Data mientras se ejecuta la aplicación, los datos no se actualizan

he tratado de acceder al delegado de la aplicación de mi UIViewController que restaura los datos, como tal, para reconstruir la pila de datos central y propagar que en todos los controladores de vista de la pila de navegación:

MyAppDelegate *app = [[UIApplication sharedApplication] delegate]; 
app.managedObjectContext = nil; 
app.persistentStoreCoordinator = nil; 
app.managedObjectModel = nil; 
managedObjectContext = [app managedObjectContext]; 

NSArray *controllers = [self.navigationController viewControllers]; 
UIViewController *c; 
for (int i = 0; i < [controllers count]; i++) { 
    c = [controllers objectAtIndex:i]; 
    [c setManagedObjectContext:managedObjectContext]; 
} 

Pero esto no funciona, solo arroja el siguiente error cuando vuelvo al controlador de vista raíz: 'The NSManagedObject with ID:0x5d79060 <x-coredata://D8E73D64-C9BA-4CFA-9213-F8BD61749155/MyObject/p2> has been invalidated.'

¿Alguien sabe cómo forzar a la aplicación a volver a cargar los datos y comenzar a trabajar con el nuevo archivo del almacén de datos?

Respuesta

1

Lo que creo que es tropezar es el hecho de que a pesar de que se pueden establecer todos sus contextos objeto gestionado, tienda coordinadores, y similares, para nil, usted todavía tiene que recrear completamente cada objeto gestionado en el uso que se estaba basado en esos objetos.

Su mejor opción es hacer lo que está haciendo ahora, pero también encontrar la forma de destruir todos los objetos de Core Data que haya utilizado. ¿Tal vez pueda mostrar sus diversos controladores de vista en la raíz y volver a cargar ese controlador desde cero, para que use su nueva pila de Datos centrales? Perderá una cierta cantidad de facilidad de uso (ya que tendrán que reconstruir la pila del controlador de vista con los nuevos datos que ha cargado), pero se asegurará de que haya destruido todo lo que necesita.

+0

Gracias por la respuesta. Esto funciona genial ¿Sabes cómo manejar las versiones en esta situación? Intenté reemplazar el archivo sqlite por una versión anterior, y me da el error "No se puede encontrar el modelo para la tienda de origen". –

+0

Necesita versionar explícitamente su archivo de modelo. Xcode tiene herramientas para hacer esto: busque la opción de agregar una versión de modelo a un 'xcdatamodel' existente. – Tim

Cuestiones relacionadas