2012-01-16 11 views
10

Il mio piano è quello di eliminare il vecchio stack di Core Data (il NSManagedObjectModel.momd file di & il file NSPersistentStore.sqlite) perché:Migrazione dei dati di base: come eliminare lo stack dei dati principali?

  • Non ho esperienza con le migrazioni Core Data.
  • il nuovo schema .xcdatamodel è completamente diverso da quello vecchio.
  • Posso cancellare in modo sicuro i vecchi dati dell'utente perché sono tutti memorizzati sul nostro server e la nuova app scarica comunque i dati più recenti dal nostro server.

In questo caso, la cancellazione completa è il modo migliore per eseguire la migrazione?

risposta

11

È una cosa assolutamente valida da fare se l'app richiede comunque l'accesso a Internet. In caso contrario, gli utenti potrebbero essere lasciati con un set di dati vuoto (si elimina il vecchio database quando si trova che è incompatibile con il modello corrente, ma non è possibile ri-popolare senza accesso al server).

Tecnicamente, questa è una cosa banale da fare. Quando si imposta la NSPersistentStoreCoordinator:

NSURL *storeURL = ...; 
NSManagedObjectModel *managedObjectModel = ...; 
NSError *error = nil; 
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: managedObjectModel]; 

// Check if we already have a persistent store 
if ([[NSFileManager defaultManager] fileExistsAtPath: [storeURL path]]) { 
    NSDictionary *existingPersistentStoreMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType: NSSQLiteStoreType URL: storeURL error: &error]; 
    if (!existingPersistentStoreMetadata) { 
     // Something *really* bad has happened to the persistent store 
     [NSException raise: NSInternalInconsistencyException format: @"Failed to read metadata for persistent store %@: %@", storeURL, error]; 
    } 

    if (![managedObjectModel isConfiguration: nil compatibleWithStoreMetadata: existingPersistentStoreMetadata]) { 
     if (![[NSFileManager defaultManager] removeItemAtURL: storeURL error: &error]) 
      NSLog(@"*** Could not delete persistent store, %@", error); 
    } // else the existing persistent store is compatible with the current model - nice! 
} // else no database file yet 

[_persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType 
              configuration: nil 
                URL: storeURL 
               options: nil 
                error: &error]; 
+0

sto ottenendo questo errore codice di errore SQLite: 11 , "l'immagine del disco del database non è corretta" all'avvio iniziale dopo l'aggiornamento. Ma nei successivi lanci, non è un problema dato che i file sqlite vengono cancellati. Ma sembra non posso evitare questo arresto anomalo delle app in una sola volta. E sentire che l'app si blocca immediatamente dopo l'aggiornamento è un po 'deludente. qualche idea ?? – raw3d

1

Se si crea un vuoto applicazione Core Data a trovare il codice necessario nelle mele commenti nel delegato di applicazione:

If you encounter schema incompatibility errors during development, you can reduce their frequency by:

  • Simply deleting the existing store: [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]

  • Performing automatic lightweight migration by passing the following dictionary as the options parameter:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.

Problemi correlati