iCloud, Core Data, migration y mapeo de models

Como se dijo en la documentation de Apple

La migration de esquemas usando models de mapeo no es compatible (se admite la migration ligera).

Me preguntaba sobre las opciones que tenemos en caso de que tengamos que lidiar con iCloud fonctionnality y la migration del model de mapeo … Sé que necesitaré cambiar mi model de Core Data en el futuro para agregar funcionalidades a mi aplicación (y no solo en un forma ligera). La cuestión es que no puedo decir ahora qué nuevas entidades serán necesarias y qué relaciones con las entidades model anteriores se establecerán.

Estaba pensando en una secuencia así:

1 – Iniciar mi aplicación haciendo la migration de mapeo de mi model de datos básicos

2 – Dejar que se sincronice con iCloud

Esto funcionará si iCloud contiene files de logging de transactions adaptados al nuevo model. En el caso de files de logging de transactions anteriores (medios adaptados al Modelo anterior) fallará.

Para evitar que estaba pensando en hacer:

1 – Iniciar mi aplicación para sincronizarlo con iCloud

2 – Hacer la migration de mapeo de mi model de datos principales

3 – Eliminar los viejos datos de iCloud actualizándolos con el nuevo

Esto no funcionará si iCloud ya contiene files de logging de transactions actualizados (medios adaptados al nuevo model).

Lo que necesito es una forma de verificar si los loggings de transactions en iCloud son compatibles con mi Modelo de Datos Núcleo actual. Hay alguna forma de hacer esto ?

Gracias.

No recomendaría usar Core Data con iCloud en una aplicación de producción.

No es lo suficientemente estable No hay una forma simple de comprobar si la aplicación está habilitada / deshabilitada en la configuration de iCloud. Y no mencionar los problemas que pueden popup si el usuario desactiva el soporte de iCloud después de habilitarlo.

Las migraciones son otro problema. La migration ligera funciona bastante bien. Pero para que la migration de un model de mapeo funcione, debe limpiar / desalojar el contenido de la "carpeta de ubicuidad" de iCloud existente, crear uno nuevo (con un nuevo nombre) y cambiar el valor asociado con NSPersistentStoreUbiquitousContentURLKey. Y, debes asegurarte de que todos los clientes hagan lo mismo. Es complejo pero factible. No estoy seguro de si vale la pena, sin embargo …

Respecto al problema de compatibilidad de la versión, aún no lo he probado, pero una idea sería get los metadatos de la tienda de un logging de transactions de iCloud y, a través del método "compatibleWithStoreMetadata" en ManagedObjectModel, verificar si la versión coincide:

// Get current model NSManagedObjectModel *myModel = [self managedObjectModel]; // Check compatibility BOOL isCompatible = [myModel isConfiguration:nil compatibleWithStoreMetadata: metadataFromTransactionLogEntry];