2009-11-22 12 views
9

Tengo una aplicación que busca datos de Internet y usa CoreData para almacenarlos en el dispositivo, para una experiencia más fluida.Limpiar todos los datos almacenados con CoreData cuando el modelo ha cambiado

Debido a que uso Core Data, cada vez que mi esquema cambia, la aplicación falla cuando trato de ejecutarlo con los datos anteriores almacenados en el dispositivo. ¿Cuál es la forma más rápida de detectar este cambio y borrar todos los datos del dispositivo, ya que no me importa volver a descargarlos? Es mejor que colapsar y reasignar el esquema al nuevo (en mi caso).

veo que esta comprobación se realiza en el captador:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 

por lo que sólo necesitan saber la metodología a aplicar para la limpieza de toda la base de datos y servido para su creación de Datos Básicos de nuevo. Gracias :)

Respuesta

14

Volviendo a esta pregunta, para eliminar todos los datos de mi almacenamiento CoreData, decidí eliminar simplemente el archivo de base de datos sqlite. Así que sólo implementó el NSPersistentStoreCoordinator así:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"myAppName.sqlite"]]; 

    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { 

     NSLog(@"Error opening the database. Deleting the file and trying again."); 

     //delete the sqlite file and try again 
     [[NSFileManager defaultManager] removeItemAtPath:storeUrl.path error:nil]; 
     if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 

     //if the app did not quit, show the alert to inform the users that the data have been deleted 
     UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error encountered while reading the database. Please allow all the data to download again." message:@"" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease]; 
     [alert show]; 
    } 

    return persistentStoreCoordinator; 
} 
+0

+1 Dado que nadie ha sugerido una mejor alternativa ... – RedBlueThing

+0

De hecho, estoy usando esto ahora ... No se pudo encontrar una buena alternativa. – Dimitris

Cuestiones relacionadas