2012-03-17 12 views
10

Tengo un proyecto antiguo de Xcode que contiene un modelo CoreData (que contiene una versión 1 y una versión 2 del modelo). Por varias razones, necesito crear un nuevo proyecto de Xcode y transferir todo el código al nuevo proyecto.Importación de un modelo CoreData antiguo en un nuevo proyecto

¿Cómo puedo importar/transferir mi antiguo modelo CoreData de tal forma que este nuevo binario podrá leer, y potencialmente migrar, las tiendas CoreData existentes que están en los iPhones y iPads de mis usuarios existentes en el ¿mundo? Me preocupa que si presiono una nueva versión con este nuevo proyecto, mis usuarios actualicen su aplicación a la versión más nueva y se bloquee porque los números de versión del modelo o modelo no coinciden.

No estoy hablando de agregar una nueva versión al modelo de datos dentro de la misma aplicación. Yo entiendo ese proceso. Se trata de mover/importar/etc. un modelo de datos existente de un proyecto anterior a un proyecto nuevo.

¿Debo simplemente copiar los archivos y agregarlos a mi proyecto manualmente? ¿Debo cambiar las cosas en mi configuración de compilación para dar cuenta de ello?

Respuesta

10

Al final, esto es cómo lo resolví:

  1. Crear nuevo proyecto con CoreData
  2. Copiar el modelo CoreData prima presentar más en mi nuevo proyecto. Agrégalo al proyecto.
  3. Elimine el modelo CoreData vacío creado automáticamente por el nuevo proyecto.
  4. En la Configuración del proyecto, en Fases de compilación, compilar fuentes, agregué el archivo de modelo CoreData copiado.

Luego utiliza el código que Scott previsto por encima de:

[NSManagedObjectModel mergedModelFromBundles:nil] 

que encuentra automáticamente todos los modelos y las combina. Al eliminar el generado automáticamente y agregar mi transferido, todo sale bien.

+0

Hola, así que solo cargando el modelo de objetos con [NSManagedObjectModel mergedModelFromBundles: nil], ¿debería poder recuperar los datos existentes? Estoy intentando consultar una tabla, pero devuelve 0 y la base de datos sqlite parece estar vacía. Scott está señalando este otro código -> [[NSManagedObjectModel alloc] initWithContentsOfURL: [NSURL fileURLWithPath: modelPath]]. –

+0

Xcode 8: solo necesitaba incorporar un modelo de otro proyecto. ¡Los pasos 1-4 funcionaron perfectamente para mí! – leanne

+0

@leanne, entonces, para inicializar los datos centrales y el modelo de objetos ¿dejaste el código que proporciona Xcode al crear un nuevo proyecto? –

2

Siempre que conserve el mismo identificador de aplicación, su nuevo código reemplazará el binario para usuarios instalados mientras mantiene intactos todos sus datos. Entonces, su nuevo proyecto esencialmente se intercambia como un nuevo binario. Después de eso, depende de usted asegurarse de cargar el archivo .sqlite correcto, manejar las actualizaciones, etc.

Déjenme editar esto un poco más. Downvote tiene un triste.

Hay una tabla ZMETADATA (o equivalente, no se puede acceder a eso ahora) que tiene toda la información necesaria para identificar las cosas. Además, hay hashes para saber si las versiones actuales están presentes de manera que la migración automática pueda suceder. Siempre que existan los valores hash, y que haya cargado su modelo a través del [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]] en lugar de [NSManagedObjectModel mergedModelFromBundles:nil], todo debería estar bien.

+0

No estoy preguntando sobre cómo sobrescribir mi aplicación binaria. Cuando ese nuevo binario se inicia y comienza a leer el almacén de aplicaciones existente, la migración automática requiere que el almacén de datos y el modelo de datos coincidan. Si no coinciden, el código CoreData emitirá una excepción y la aplicación se bloqueará. –

+0

Sí ... y con la condición de que tenga las mismas versiones de Data Core del .xcdatamodeld en la * misma aplicación identificada *, la migración ocurrirá. Solo agregarlos a su proyecto actual debería ser suficiente, sí. –

+0

No tengo claro qué código debería funcionar. Estoy intentando cargar el modelo de Objeto con [NSManagedObjectModel mergedModelFromBundles: nil], sugerido por @KennyWyland, pero no funciona. También he intentado con [[NSManagedObjectModel alloc] initWithContentsOfURL: [NSURL fileURLWithPath: modelPath]], pero todo se rompe. –

-1

Encontré una manera más simple. Creé un nuevo proyecto con datos básicos y luego lo cerré sin construirlo ni ejecutarlo. Luego usé un IDE para abrir el xcdatamodeld. Un editor de texto probablemente funcione igual de bien. Tuve que profundizar en el contenido. Esto puede deberse a que estoy usando PHPStorm y estoy tratando de hacer un proyecto de esto. El archivo que quería editar veía así:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="1" systemVersion="11A491" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier=""> 
</model> 

entonces me abrió la xcdatamoleld fuente y copiar cada cosa entre las etiquetas de modelo para el nuevo archivo. Cerré los archivos y construí el proyecto. No copié los datos reales del modelo (.Almacenamiento de datos).

Una advertencia: en mi proyecto original, cambiaba constantemente el modelo y borraba los datos del modelo. Xcode no pudo manejarlo y lanzó varios errores. La última vez que lo hice, me dio la advertencia:

CoreData: warning: Unable to load class named 'Performance' for entity 'Performance'. Class not found, using default NSManagedObject instead. 

Esta advertencia reoccured en el nuevo proyecto, así que es algo malo en la definición del modelo. Afortunadamente, no causa ningún problema con la ejecución. Si no tiene esta advertencia, puede estar bien.

Esto fue con Xcode 8.2.1 y fue un proyecto de Swift.

+1

Editar las partes internas de los archivos es una forma segura de introducir demonios y atornillar su proyecto. Es una buena idea dejar que Xcode controle esas cosas, especialmente porque podrían cambiar de una versión a otra. –

+0

El OP preguntaba por la importación de un modelo existente en un nuevo proyecto. No hay nada que 'atornillar'. Incluso si no funcionó, uno solo tiene que eliminar el nuevo proyecto y crear otro. Tengo un segundo proyecto que está muy avanzado en su desarrollo. No usaría este método en eso. Si Apple proporcionara métodos para importar un modelo existente, no necesitaríamos esta publicación. – curt

Cuestiones relacionadas