En mi aplicación a veces necesito reconstruir y volver a llenar el archivo de la base de datos. SQLite databse es creado y administrado por la pila CoreData.¿Cómo forzar a coredata a reconstruir el modelo de base de datos sqlite?
Lo que intento hacer es soltar el archivo y luego simplemente recrear el objeto persistentStoreCoordinator.
funciona bajo el simulador, pero no en el dispositivo, donde Recibo un error de este tipo:
NSFilePath = "/var/mobile/Applications/936C6CC7-423A-46F4-ADC0-7184EAB0CADD/Documents/MYDB.sqlite";
NSUnderlyingException = I/O error for database at /var/mobile/Applications/936C6CC7-423A-46F4-ADC0-7184EAB0CADD/Documents/MYDB.sqlite. SQLite error code:1, 'table ZXXXX already exists';
no puedo encontrar la causa de esto de ninguna manera. Indica dos problemas diferentes: el error de cacao 256 indica que el archivo no existe o no es legible. Pero el archivo IS se creó después de crear persistenStoreCoordinator, aunque está vacío, pero después de ejecutar algunas consultas, desaparece.
El segundo mensaje que indica que se intentó crear una tabla existente es bastante extraño en ese caso.
Estoy bastante confundido y no entiendo qué está pasando aquí. Mi código tiene este aspecto:
NSString *path = [[WLLocalService dataStorePath] relativePath];
NSError *error = nil;
WLLOG(@"About to remove file %@", path);
[[NSFileManager defaultManager] removeItemAtPath: path error: &error];
if (error != nil) {
WLLOG(@"Error removing the DB: %@", error);
}
[self persistentStoreCoordinator];
WLLOG(@"Rebuild DB result %d", [[NSFileManager defaultManager] fileExistsAtPath: path]);
Después de ejecutar este código, el archivo DB existe pero está vacío. Cuando se ejecuta la primera consulta (y todas las siguientes), me da el error anterior y el archivo desaparece.
¿Alguien tiene una idea de lo que está mal con eso?
Muchas gracias por indicarme el camino correcto!
Gracias por un consejo, es interesante y voy a intentarlo.¿Pero no es lo mismo cuando todas las instancias de NSPersistentStoreCoordinator se lanzan justo antes de que se elimine el archivo? Eso es lo que sucede justo antes de llamar a mi método anterior. Supongo que eliminará y liberará todas las estructuras de datos posteriores también. ¿Puedes explicar por qué es importante eliminar explícitamente la tienda persistente del coordinador antes de eliminar el archivo? – Burt
¡Así que probé tu solución y funciona! ¡Muchas gracias por eso! Sin embargo, todavía me pregunto cuál es la diferencia entre eliminar explícitamente la tienda persistente y simplemente liberar al coordinador. – Burt
Si configura 'NSPersistentStoreCoordinator' como nulo dentro del' NSManagedObjectContext' y lo libera, entonces probablemente logre lo mismo, pero eso es mucho más pesado que simplemente instruir al 'NSPersistentStoreCoordinator' para eliminar la tienda. –