2009-11-22 6 views
9

Ho un'app che recupera dati da Internet e utilizza CoreData per archiviarli nel dispositivo, per un'esperienza più fluida.Pulire tutti i dati archiviati con CoreData quando il modello è cambiato

Poiché utilizzo i dati principali, ogni volta che il mio schema cambia, l'app si arresta in modo anomalo quando provo a eseguirlo con i dati precedenti memorizzati sul dispositivo. Qual è il modo più veloce per rilevare questa modifica e cancellare tutti i dati dal dispositivo, dal momento che non mi interessa scaricarli di nuovo tutti. Batte crash e rimappatura dello schema in quello nuovo (nel mio caso).

vedo che questo controllo viene eseguito nel getter:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 

quindi ho solo bisogno di conoscere la metodologia per implementare per pulire l'intero database e predisporre le Core Data di nuovo. Grazie :)

risposta

14

Tornando a questa domanda, per eliminare tutti i dati dal mio archivio CoreData ho deciso di cancellare semplicemente il file del database sqlite. Così ho appena implementato la NSPersistentStoreCoordinator in questo modo:

- (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 dato che nessun altro ha suggerito un'alternativa migliore ... – RedBlueThing

+0

sto effettivamente usando questo ora ... Impossibile trovare una buona alternativa. – Dimitris

Problemi correlati