2012-01-16 12 views
10

Mi plan es eliminar la vieja pila de Datos Básicos (el NSManagedObjectModel.momd archivo & el archivo NSPersistentStore.sqlite) porque:Migración de datos principales: ¿cómo eliminar la pila de datos básicos?

  • no tengo experiencia con las migraciones de Datos Básicos.
  • el nuevo esquema .xcdatamodel es completamente diferente al anterior.
  • Puedo eliminar de forma segura los datos antiguos del usuario porque están almacenados en nuestro servidor y la nueva aplicación descarga los datos más recientes de nuestro servidor de todos modos.

En este caso, ¿se ha eliminado por completo la mejor manera de realizar la migración?

Respuesta

11

Es una opción perfectamente válida si su aplicación requiere acceso a Internet de todos modos. De lo contrario, los usuarios pueden quedar con un conjunto de datos vacío (elimina la base de datos anterior cuando considera que es incompatible con el modelo actual, pero no puede volver a llenarla sin tener acceso al servidor).

Técnicamente, eso es algo trivial. Al configurar 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

estoy recibiendo este código de error SQLite de error: 11 , 'la imagen del disco de la base de datos está mal formada' en el lanzamiento inicial después de la actualización. Pero en los lanzamientos posteriores, no es un problema ya que los archivos sqlite se eliminan. Pero parece que no puedo evitar este accidente de una sola aplicación. Y sentir que la aplicación falla inmediatamente después de la actualización es algo decepcionante. algunas ideas ?? – raw3d

1

Si crea una aplicación de Datos Básicos en blanco que encuentre el código necesario en las manzanas comentarios en el Delegado de aplicación:

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.

Cuestiones relacionadas