tutorial read español data coredata ios core-data

ios - read - Migración de datos de núcleo de atributo de cadena a entero 16



read core data swift (2)

Tengo problemas para migrar un atributo de entidad de tienda de String a Integer 16. Estos son los pasos que tomo:

  1. Añadir versión de modelo ...
  2. En el nuevo modelo, cambie el atributo Entidad de Cadena a Int 16.
  3. Seleccione el nuevo modelo en File Inspector> Modelo de datos base versionado> Modelo actual
  4. Crear un modelo de mapeo para los modelos antiguos y nuevos.
  5. correr

Aquí está el error:

Error no resuelto Error Dominio = NSCocoaErrorDomain Code = 134140 "No se pudo completar la operación. (Cacao error 134140.)" UserInfo = 0xbd5cd20 {reason = No se puede encontrar o inferir automáticamente el modelo de mapeo para la migración, destinationModel = ...

El modelo de mapeo está ahí en el .app compilado:

y en el proyecto:

La migración funciona para atributos como Integer 16> Integer 32, o al cambiar nombres de atributos.

Intenté crear un proyecto simple de Core Data y la migración funcionó automáticamente (con y sin modelo de mapeo) de String a Integer 16 y viceversa.

La parte más extraña es que intenté buscar programáticamente todos los modelos de mapeo en el paquete y no se encuentra ninguno para los modelos de origen / destino actuales.


Esto sucede porque Core Data no puede migrar automáticamente su atributo. Esto se debe a que no puede garantizar que una cadena siempre se ajuste a un int (incluso aunque sepa que sus datos sí).

Entonces, lo que necesitas hacer es usar un modelo de mapeo. Aquí está cómo hacerlo:

  1. En Xcode, cree un nuevo modelo de mapeo (Archivo> Nuevo> Nuevo archivo), seleccione Modelo de mapeo en la sección Datos principales
  2. Seleccione los modelos de origen y destino en el asistente
  3. Básicamente, esto lo coloca en el mismo lugar que la migración liviana, todo se hace automáticamente, excepto que tiene la opción de anular algunos mapas. En concreto, ese que te está dando problemas.
  4. Crear una nueva clase de política de mapeo (Extender NSEntityMigrationPolicy )
  5. Implemente createDestinationInstancesForSourceInstance:entityMapping:manager:error: que le dará la instancia de origen para que pueda convertir esa cadena en un int y almacenarla en la nueva tienda.

Su código debe verse algo como esto:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error { NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; // Copy all the values from sInstance into newObject, making sure to apply the conversion for the string to int when appropriate. So you should have one of these for each attribute: [newObject setValue:[sInstance valueForKey:@"xyz"] forKey:@"xyz"]; [manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping]; }

  1. Entonces, todo lo que tiene que hacer es establecer esa política en el modelo de mapeo. Seleccione el archivo de modelo de mapeo, elija el mapeo de Entidad apropiado y establezca la CustomPolicy en el panel derecho.

Asegúrese de cambiar la configuración de la migración para eliminar la inferencia automática de tipos en cualquier lugar donde inicie Core Data

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];

Eso debería ser ...


Para aquellos, que han roto miles de lanzas en el error "No se puede encontrar el modelo de mapeo para la migración", esto podría ayudar:

  1. Asegúrese de haber creado el archivo de asignación en la carpeta / grupo apropiado (antes de presionar Cmd + N - seleccione el archivo .xcdatamodeld en el navegador de proyectos).
  2. Limpia el proyecto.
  3. Reconstruye el proyecto y ejecuta.

En mi caso, la aplicación encontró automáticamente el modelo de mapeo después de limpiar / reconstruir = /