2010-07-08 18 views
29

Estoy trabajando en una aplicación para iPhone que utiliza Core Data. La mayoría de las veces, solo pruebo en el simulador, pero ocasionalmente bombeo la aplicación al iPad para asegurarme.Datos principales: Error "No se pueden combinar modelos con dos entidades diferentes con el nombre 'foo'"

he cambiado recientemente mi modelo de datos básicos, y ahora cuando envío la aplicación para el iPad, me sale una excepción SIGABRT diciéndome:

Can't merge models with two different entities named 'foo' 

OK, que entiendo. La versión anterior de la base de datos existe en el dispositivo. Entonces, yo (intento) matar la versión anterior presionando/sosteniendo el ícono de la aplicación hasta que empiece a moverse, y luego toque su "X". El iPad me pregunta si quiero eliminar la aplicación y todos sus datos. Yo digo si.

Reconstruyo la aplicación, apuntar al iPad y obtener el mismo error.

¿Hay algún truco para hacer desaparecer realmente la base de datos anterior?

Respuesta

0

En algún momento querrá leer acerca de model migration para que pueda actualizar automáticamente la base de datos de datos básicos en el dispositivo cuando los usuarios actualicen.

Pero si usted está en desarrollo y no tiene ningún usuario instalado, puede borrar la base de datos de datos ingresando a iTunes con su dispositivo conectado, eliminando la aplicación de su dispositivo y sincronizándola. A continuación, arrastre la nueva versión de su aplicación a iTunes y vuelva a sincronizarla. Deberías tener un modelo limpio.

2

"No se puede combinar modelos con dos entidades diferentes nombre 'foo'"

Esto suena más como dos datamodels beeing se fusionaron. Prueba una reconstrucción limpia de tu aplicación. Comprueba si realmente hay solo un modelo de datos en tu proyecto.

Las principales cargas por defecto pila de datos todos los modelos de datos en su paquete

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

Si los modelos antiguos están presentes todos ellos se fusionan.

+0

Al cambiar de modelo en una aplicación, si tenemos un modelo antiguo '' Model1'' en la aplicación en vivo y queremos actualizar la aplicación y usar otro modelo nuevo llamado '' Model2'', es suficiente si eliminar '' Model1'' del proyecto? O '' Model1'' no se eliminará de la aplicación en vivo a menos que específicamente lo hagamos cuando se actualice. – amb

+0

lo que probablemente quiera es la versión de modelo https://developer.apple.com/library/mac/documentation/cocoa/conceptual/CoreDataVersioning/Articles/Introduction.html –

8

Su mensaje de error no significa que tiene dos bases de datos, es decir, tiendas persistentes. Significa que tiene dos archivos de modelo superpuestos (que son archivos fuente) en el proyecto Xcode. Eliminar la compilación no es bueno porque el proyecto solo recrea el error en la próxima compilación.

Los archivos de modelo no se pueden superponer. Debes eliminar la duplicación. La duplicación proviene de (1) tener dos versiones del mismo archivo o (2) tener dos archivos de modelo con la misma entidad en ambos.

Para (1), necesita eliminar el duplicado anterior. Los archivos del modelo tienen una extensión de modelName.xcdatamodel. Para encontrar el duplicado, abre el objetivo y marca debajo de Compile Sources. Todos los archivos de modelo incluidos en el objetivo se enumerarán allí. Eliminar el duplicado

Para (2), puede tener tantos archivos de modelo como desee pero no puede tener dos archivos de modelo con la misma entidad en ambos. A veces, los principiantes de Core Data intentan vincularse a los archivos de modelo juntos haciendo que compartan una o más entidades. Si lo ha hecho, deberá eliminar la entidad duplicada de uno de los modelos.

+2

Probablemente cambió el nombre del modelo o configuró una versión, ambas de que dejará un viejo archivo compilado .mom en el directorio de compilación. Esa es la causa n. ° 1 de este error que he visto. –

+0

Eso es bueno saber.Yo obsesivamente limpio mis compilaciones así que probablemente rara vez me encuentro con ese problema en particular. – TechZen

22

La tienda persistente se mantendrá hasta que elimine la aplicación de su dispositivo como en el simulador. Si realmente desea comenzar de nuevo, elimine la aplicación de su iPad y usará el nuevo modelo.

Sin embargo, como todos han señalado, ese no es el error que está obteniendo, haga una compilación limpia de su aplicación (es decir, seleccione Generar -> Limpiar del menú en Xcode) y realice una compilación nueva. Si el error persiste, entonces tiene más de un archivo xcdatamodel compilado en su proyecto.

+0

Por pura coincidencia, llegué a este problema exacto no cuatro horas después de leer esta respuesta. Una limpieza no resolvió el problema, pero la eliminación de la aplicación del simulador después de una limpieza hizo. Extraño. – TechZen

+1

El Sim tiene el mismo problema que el directorio de compilación. Cuando implementa una nueva compilación, no eliminará los archivos que ya no se mencionan en la nueva aplicación. Cambios como este también requieren eliminar la aplicación del Sim. Únete a mí en un radar en ese caso? –

+0

Esto funcionó para mí. Se eliminó la aplicación y se limpió. ¡Gracias! – Sandoze

60

Para aquellos que vienen a través de esta pregunta después de tratar de utilizar datos básicos migraciones ligeros:

que estaba teniendo este problema incluso después de seguir las instrucciones para crear una nueva versión de mi modelo de datos. Noté que había dos archivos ".mom" en mi paquete de aplicaciones, uno ".mom" y uno ".momd" que contenían archivos ".mom".

La clave es reemplazar la implementación de - (NSManagedObjectModel *)managedObjectModel que se genera para que con esta aplicación:

- (NSManagedObjectModel *)managedObjectModel { 

    if (managedObjectModel != nil) { 
     return managedObjectModel; 
    } 

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

    return managedObjectModel; } 

donde 'Foo' es el nombre de su modelo de datos.

Afortunadamente esto es útil para alguien: pasé MUCHAS horas golpeando mi cabeza contra la pared en esto. Gracias de nuevo, Apple! :)

+1

Muchas gracias. – RyanJM

+0

muchas gracias veryyyyyyy ....... – mongeta

+1

¡Esto me salvó el día! – cpungaliya

6

Elimina la aplicación de tu iPad y luego reiníciala. Después de que el iPad se haya reiniciado, haz una compilación limpia.

+0

¡Guau, eso fue todo! Busqué mucho y mucho tiempo en el sistema de archivos en el directorio del simulador y no había * nada * con respecto a CoreData, pero no funcionó. Aún así, eliminar ayudó, por la razón que sea. Debería haberlo intentado antes. – leberwurstsaft

3

Tuve el mismo problema después de cambiar el nombre del modelo de la base de datos. Después de limpiar, reconstruir y volver a instalar la aplicación, las mismas consecuencias: dos paquetes .momd diferentes con el mismo contenido aparecen en el paquete de la aplicación (oldname.momd y newname.momd).
He resuelto este problema cambiando la "Versión de herramientas" de 4.1 a 3.2 en el panel "Modelo de datos principales" (Inspector de archivos del modelo de datos). Después de esto, aclaré por completo y volví a construir el proyecto, luego modifiqué nuevamente esta propiedad a 4.1 y de nuevo volví a borrar y reconstruí la aplicación.
En este caso Xcode hace dos archivos "diseño" y "elementos" (para versiones anteriores compatibles) contra "contenidos" en el paquete * .xcdatamodeld, esto hace que el compilador del modelo de datos de Xcode vuelva a verificar el nombre del modelo y todo estará bien con paquetes .momd en la zona de pruebas de la aplicación: solo aparece uno después de reinstalar la aplicación.

+0

¡Trabajó para mí! Gracias – JastinBall

1

para mí solo funcionó el "Restablecer contenido y configuración" del simulador. de lo contrario, no podría encontrar ningún problema con mi proyecto.

0

Tuve el mismo problema.
Intente limpiar Shift + Cmnd + K y limpiar la carpeta de compilación ALT + Shift + Cmnd + K en Xcode. Esto funcionó bien para mí.

Cuestiones relacionadas