¿Qué debo hacer para que Core Data migre modelos automáticamente?

He leído en la documentación sobre la migración automática / ligera para los modelos de Core Data, pero estoy teniendo problemas en la realidad de implementarlo.

Según entiendo, la aplicación debería notar que el modelo que tiene y el modelo que existe en un dispositivo ya no son lo mismo. Si solo ha agregado atributos o relaciones y cambios simples similares, entonces el modelo debe actualizarse automáticamente.

Cualquier puntero: ¿necesito configurar algo en xCode?

Ahora descubrí que esto es bastante simple, una vez que sabes dónde buscar.

En mi AppDelegate configuro NSPersistentStoreCoordinator, y debe agregar algunas opciones para indicarle que maneje la migración automática:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; NSError *error; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { // Handle error NSLog(@"Problem with PersistentStoreCoordinator: %@",error); } 

Entonces necesitas hacer un pequeño truco en xCode:

  1. Seleccione su archivo xcdatamodel
  2. Seleccione el menú de diseño en la parte superior, luego el modelo de datos, luego elija Agregar versión de modelo
  3. Su archivo xcdatamodel se moverá a un nuevo directorio con el mismo nombre que su archivo xcdatamodel pero con la extensión xcdatamodeld – habrá un segundo archivo en este directorio con un 2 en el nombre. Seleccione el nuevo archivo y luego Diseño-> Modelo de datos-> Establecer versión actual ( en Xcode 4 lo hace )
  4. Si ya ha realizado los cambios que han hecho que su proyecto sea incompatible, elimine estos cambios del archivo xcdatamodel original. Si aún tiene que hacer los cambios, simplemente edite el archivo 2.xcdatamodel (el que acaba de crear la versión actual).
  5. Ahora cuando instale esta versión en un dispositivo que tenga el modelo anterior, actualizará automáticamente ese modelo al nuevo modelo.

Esto parece genial y tan simple como yo quería, pero creo que debes tener cuidado durante el desarrollo mientras cambias un modelo; de lo contrario, tendrás que crear una nueva versión para cada cambio.

Creo que lo que haré es conservar todos los archivos modificados y, una vez que me prepare para implementar mi actualización, eliminaré todos los archivos intermedios y solo implementaré los modelos más antiguos y más recientes.


ACTUALIZACIÓN (15/07/2011):

Gracias a @ rockstarberlin por señalar que hay documentación actualizada en Apple:

Xcode 4: configuración de la versión actual de un modelo de objetos administrados

Actualización: 8/19/2013 mejor enlace:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmModelFormat.html

Esto fue increíblemente útil. La documentación de Apple era, como de costumbre, tristemente incompleta. Recomiendo hacer una comstackción limpia, ya que me encontré con un error “No se pueden combinar modelos con dos entidades diferentes xxx” la primera vez que ejecuté después de hacer estos cambios. La construcción limpia lo solucionó.

La respuesta de Grouchal es perfecta … pero si todavía tiene el “No se pueden fusionar modelos con dos entidades diferentes xxx” incluso después de limpiar la comstackción varias veces … Es posible que tenga problemas con la forma en que se está cargando el ManageObjectModel .. .take en mirar este … que me ayudó a arreglarlo …

problemas de migración de datos centrales

Además, si descubrió esta publicación, como yo lo hice, después de obtener el error “El modelo utilizado para abrir la tienda no es compatible con el utilizado para crear la tienda” y simplemente está depurando con el simulador y desea reemplazar completamente el viejo modelo instalado, puede simplemente Restablecer la aplicación Simulador o eliminar su aplicación del simulador probablemente también funcione.

No se me ocurrió intentar esto hasta leer los mensajes aquí, en ese momento me di cuenta de que había instalado la aplicación en el simulador y luego lo cambié, lo que provocó el error de tiempo de ejecución mencionado anteriormente.

Para seguir la respuesta de Santthosh, pensé que publicaría el fragmento de código aquí mismo. Necesita crear su ManageObjectModel con initWithContentsOfURL: lugar de mergedModelFromBundles: contrario, obtendrá un error:

No se pueden combinar modelos con dos entidades diferentes XXX y XXX

Si su archivo de modelo se llama “Modelo”, así es como crea el managedObjectModel:

 NSString *path = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"]; NSURL *momURL = [NSURL fileURLWithPath:path]; managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 

Crédito a esta publicación de blog

el menú en Xcode 4 cambió un poco. Aquí hay una descripción de cómo hacerlo en Xcode 4:

Xcode 4: configuración de la versión actual de un modelo de objetos administrados

He tenido este problema durante años y probé todas estas respuestas sin éxito. Hoy finalmente descubrí lo que estaba haciendo mal. Problema muy simple, pero lo pasé por alto. Al crear una versión más nueva del modelo de datos, si está AGREGANDO columnas, asegúrese de marcarlos como OPCIONALES. Si no lo hace, la migración simple no funcionará porque los nuevos valores de columna no se completarán.

Tan pronto como me aseguré de que mis nuevas columnas tenían marcada “opcional”, intenté la migración nuevamente y funcionó.

Me encontré con esta publicación debido a problemas diferentes, pero el error fue ” La configuración del modelo utilizada para abrir la tienda es incompatible con la que se utilizó para crear la tienda.

Aquí estaba mi problema y la solución a eso. En mi modelo, estaba usando configuraciones . Algunas de las entidades se almacenaban en un archivo y las otras en un segundo archivo. (Tengo algunos valores predeterminados que pueden necesitar descargarse periódicamente, y sería un dolor increíble fusionarlos en el conjunto). De todos modos, hice una nueva entidad. El progtwig parecía funcionar bien, pero cada vez que abandonaba, obtenía el error anterior.

La solución fue mirar mis configuraciones, darme cuenta de que tenía una entidad que no estaba actualmente en ninguna de las configuraciones y agregarla a una. Corre como un sueño.

Esto no solucionará el problema del OP. Pero tal vez alguna persona frustrada que aterrice aquí a través de google estará en el bote en el que estuve 🙂

iOS 4.0+

 NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"model" withExtension:@"momd"]; managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

Edición menor a las impresionantes instrucciones anteriores de @Grouchal para Xcode versión 5:

Antiguo: 2. Seleccione el menú de diseño en la parte superior, luego el modelo de datos, luego elija Agregar versión de modelo

Versión 5+: 2. Seleccione el menú Editor, luego Agregar versión modelo …, escriba su Nombre de versión y Basado en el modelo (seleccione su modelo original de la lista)