El modelo utilizado para abrir la tienda es incompatible con el utilizado para crear la tienda

Creé un modelo de Core Data en xcode 3.2 y luego de actualizar en Xcode 4.2, agregué una nueva entidad de la subclase NSManagedObject (consulte la nueva entidad).

En primer lugar, se ve raro porque no está en el mismo grupo que el anterior. Aquí está la imagen en mi xcode 4.2 (AlkitabDB es el que he creado en xcode 3.2, EndeDB es el nuevo de la versión actual de xcode (4.2):

la nueva entidad no se agrupa en el modelo xdata

En segundo lugar, lo dejé tal como está, luego accedí a la segunda entidad (la nueva) de la misma manera que a la primera entidad (la anterior) y aparece el error como titulado.

Aquí está el error:

2012-01-16 21:13:38.496 iHuria[55953:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn't be completed. (Cocoa error 134100.)" UserInfo=0x8829cd0 {metadata={type = immutable dict, count = 7, entries => 2 : {contents = "NSStoreModelVersionIdentifiers"} = {type = immutable, count = 0, values = ()} 4 : {contents = "NSPersistenceFrameworkVersion"} = {value = +320, type = kCFNumberSInt64Type} 6 : {contents = "NSStoreModelVersionHashes"} = {type = immutable dict, count = 1, entries => 0 : {contents = "AlkitabDB"} = {length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd} } 7 : {contents = "NSStoreUUID"} = {contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"} 8 : {contents = "NSStoreType"} = {contents = "SQLite"} 9 : {contents = "NSStoreModelVersionHashesVersion"} = {value = +3, type = kCFNumberSInt32Type} 10 : {contents = "_NSAutoVacuumLevel"} = {contents = "2"} } , reason=The model used to open the store is incompatible with the one used to create the store}, { metadata = { NSPersistenceFrameworkVersion = 320; NSStoreModelVersionHashes = { AlkitabDB = ; }; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers = ( ); NSStoreType = SQLite; NSStoreUUID = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"; "_NSAutoVacuumLevel" = 2; }; reason = "The model used to open the store is incompatible with the one used to create the store"; } 

Busqué la solución antes y descubrí que debería eliminar la aplicación del simulador y volver a ejecutar la aplicación, y no funcionó. ¿Alguien sabe una solución para este problema? Por favor ayuda.

Retire la aplicación del simulador y realice una limpieza en su proyecto. Eso debería aclarar esos problemas. Asegúrese de que no esté ejecutándose en el depurador cuando elimine la aplicación o de lo contrario no la eliminará correctamente.

Si quiere asegurarse de que no esté, consulte este directorio Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/ para la carpeta de su aplicación, bajo la versión que está ejecutando.

Nota: Esto es solo para desarrollo. Para la producción, debe implementar algún tipo de migración. Google “Core Data Migration”, con la migración ligera es la más simple.

¡Eliminar la aplicación a veces no es el caso! ¡Sugiere que tu aplicación ya ha sido publicada! No puede simplemente agregar una nueva entidad a la base de datos y seguir adelante; ¡necesita realizar la migración!

Para aquellos que no quieren profundizar en la documentación y están buscando una solución rápida:

  1. Abra su archivo .xcdatamodeld
  2. haga clic en Editor
  3. seleccione Agregar versión de modelo …
  4. Agregue una nueva versión de su modelo (se agrega el nuevo grupo de modelos de datos)
  5. seleccione el archivo principal, abra el inspector de archivos (panel derecho)
  6. y en el Versioned core data model seleccione su nueva versión del modelo de datos para el modelo de datos actual
  7. ESO NO ES TODO) Debería realizar la llamada “migración ligera”.
  8. Vaya a su AppDelegate y encuentre dónde se está creando persistentStoreCoordinator
  9. Encuentre esta línea if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. Reemplace las opciones nil con @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} (en realidad se proporciona en el código comentado en ese método)
  11. ¡Aquí tienes, diviértete!

PD Esto solo se aplica a la migración liviana. Para que su migración califique como migración ligera, sus cambios deben limitarse a esta banda estrecha:

  • Agregar o eliminar una propiedad (atributo o relación).
  • Hacer una propiedad no opcional opcional.
  • Establezca un atributo opcional no opcional, siempre que proporcione un valor predeterminado.
  • Agregar o eliminar una entidad.
  • Cambiar el nombre de una propiedad.
  • Renombra una entidad.

Simplemente agregue el atributo Opciones al crear persistentStoreCoordinator en el archivo AppDelegate.m para el método de datos básicos como se muestra a continuación

C OBJETIVO

 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } NSLog(@"persistentStoreCoordinator___"); NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"]; NSMutableDictionary *options = [[NSMutableDictionary alloc] init]; [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption]; [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } NSLog(@"persistentStoreCoordinator___2"); return _persistentStoreCoordinator; } 

RÁPIDO

  lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = { // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. // Create the coordinator and store let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite") var failureReason = "There was an error creating or loading the application's saved data." // MAIN LINE OF CODE TO ADD let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true] do { try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: mOptions) } catch { // Report any error we got. var dict = [String: AnyObject]() dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" dict[NSLocalizedFailureReasonErrorKey] = failureReason dict[NSUnderlyingErrorKey] = error as NSError let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) // Replace this with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)") abort() } return coordinator } 

Había resuelto mi problema …

Respuesta: elimine la aplicación del simulador, realice una limpieza y vuelva a generar su proyecto.

Nota: Cada vez que realice cambios en la definición de datos centrales, elimine la aplicación instalada en el dispositivo físico o simulador, limpie el proyecto y vuelva a generar de nuevo.

Sí. Una vez que eliminas la aplicación en el dispositivo físico y la reconstruyes, funciona.

Para swift, en AppDelegate.swift encuentra la línea

 try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: nil ) 

y reemplazarlo con

 try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]) 

Cada vez que realice un cambio en la definición de Fecha Core, debe eliminar las aplicaciones instaladas en el dispositivo físico o simulador.

Acabo de pasar varios días luchando contra este error, así como fusiones fusionadas deModeloFromBundles y obteniendo el error “No se pueden fusionar modelos con dos entidades diferentes denominadas *”.

Resultó que el problema principal era que Xcode no eliminaba los recursos antiguos de los dispositivos y tenía versiones antiguas de mi modelo de datos (archivos .mom) que causaban conflictos. Esta es la razón por la que eliminar la aplicación solucionó el problema en uno de mis dispositivos.

Después de encontrar esta publicación de blog a través de otra respuesta de SO hice que mi aplicación fuera más tolerante con los modelos antiguos al cambiar esta línea que busca TODOS los archivos .mom:

 NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil]; 

a esto, que solo se ve en el directorio de Filtros:

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

Usé recursivePathsForResourcesOfType a partir de esta pregunta : para ayudar a resolver esto, inicie sesión todos los archivos .mom en la aplicación:

 NSArray *momPaths = [self recursivePathsForResourcesOfType:@"mom" inDirectory:[[NSBundle mainBundle] resourcePath]]; NSLog(@"All .mom files:%@",momPaths); 

También utilicé iExplorer para ver los archivos .mom extraños (no intenté borrarlos todavía).

El método a continuación también fue útil. Demostró que una entidad estaba en el modelo fusionado devuelto por [psc managedObjectModel] que ya no existía en ninguno de mis modelos ni en la propia tienda. Esto fue lo que me permitió creer que un viejo modelo estaba siendo almacenado en caché en el dispositivo mismo que el edificio limpio no eliminó. El método registra cada entidad que es la misma, ha sido modificada, agregada o eliminada del modelo. (escrito con esta respuesta SO como punto de partida):

 - (BOOL)comparePersistentStore:(NSPersistentStoreCoordinator *)psc withStoreURL: (NSURL *)storeURL { NSError *error = nil; // Get the entities & keys from the persistent store coordinator NSManagedObjectModel *pscModel = [psc managedObjectModel]; NSDictionary *pscEntities = [pscModel entitiesByName]; NSSet *pscKeys = [NSSet setWithArray:[pscEntities allKeys]]; //NSLog(@"psc model:%@", pscModel); //NSLog(@"psc keys:%@", pscKeys); NSLog(@"psc contains %d entities", [pscModel.entities count]); // Get the entity hashes from the storeURL NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:&error]; NSDictionary *storeHashes = [storeMetadata objectForKey:@"NSStoreModelVersionHashes"]; //NSLog(@"store metadata:%@", sourceMetadata); NSLog(@"store URL:%@", storeURL); NSLog(@"store NSStoreUUID:%@", [storeMetadata objectForKey:@"NSStoreUUID"]); NSLog(@"store NSStoreType:%@", [storeMetadata objectForKey:@"NSStoreType"]); NSSet *storeKeys = [NSSet setWithArray:[storeHashes allKeys]]; // Determine store entities that were added, removed, and in common (to/with psc) NSMutableSet *addedEntities = [NSMutableSet setWithSet:pscKeys]; NSMutableSet *removedEntities = [NSMutableSet setWithSet:storeKeys]; NSMutableSet *commonEntities = [NSMutableSet setWithSet:pscKeys]; NSMutableSet *changedEntities = [NSMutableSet new]; [addedEntities minusSet:storeKeys]; [removedEntities minusSet:pscKeys]; [commonEntities minusSet:removedEntities]; [commonEntities minusSet:addedEntities]; // Determine entities that have changed (with different hashes) [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { NSData *storeHash = [storeHashes objectForKey:key]; NSEntityDescription *pscDescrip = [pscEntities objectForKey:key]; if ( ! [pscDescrip.versionHash isEqualToData:storeHash]) { if (storeHash != nil && pscDescrip.versionHash != nil) { [changedEntities addObject:key]; } } }]; // Remove changed entities from common list [commonEntities minusSet:changedEntities]; if ([commonEntities count] > 0) { NSLog(@"Common entities:"); [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { NSData *storeHash = [storeHashes objectForKey:key]; NSEntityDescription *pscDescrip = [pscEntities objectForKey:key]; NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash); }]; } if ([changedEntities count] > 0) { NSLog(@"Changed entities:"); [changedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { NSData *storeHash = [storeHashes objectForKey:key]; NSEntityDescription *pscDescrip = [pscEntities objectForKey:key]; NSLog(@"\tpsc %@:\t%@", key, pscDescrip.versionHash); NSLog(@"\tstore %@:\t%@", key, storeHash); }]; } if ([addedEntities count] > 0) { NSLog(@"Added entities to psc model (not in store):"); [addedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { NSEntityDescription *pscDescrip = [pscEntities objectForKey:key]; NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash); }]; } if ([removedEntities count] > 0) { NSLog(@"Removed entities from psc model (exist in store):"); [removedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) { NSData *storeHash = [storeHashes objectForKey:key]; NSLog(@"\t%@:\t%@", key, storeHash); }]; } BOOL pscCompatibile = [pscModel isConfiguration:nil compatibleWithStoreMetadata:storeMetadata]; NSLog(@"Migration needed? %@", pscCompatibile?@"no":@"yes"); return pscCompatibile; } 

uso: llamado antes de agregar cada tienda a NSPersistentStoreCoordinator:

  [self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL]; _iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.iCloudStoreURL options:options error:&localError]; 
  1. Deja de ejecutar la aplicación.
  2. Eliminar aplicación en el simulador.
  3. Product -> Clean
  4. Construir, correr.

La solución más simple que funcionó para mí en Swift 2.1, Xcode 7 es:

  1. Elimina la aplicación del simulador (Cmd + Shift + H para ir a la pantalla de inicio. Pulsa prolongadamente la aplicación, haz clic en cruzar, del modo habitual en que eliminas una aplicación de tu teléfono)

  2. Cmd + Shift + H nuevamente para detener el baile de aplicaciones

  3. Regrese a su proyecto y vuelva a ejecutar

Tuve este problema al escribir / leer desde Core Data con 2 entidades configuradas. Eliminar la aplicación y volver a ejecutar el progtwig solucionó el problema

Acabo de eliminar el archivo [Simulator App Folder]/Document/*.sqlite después de hacer cambios en las entidades y funcionó. Y, por supuesto, el archivo .sqlite contiene todos los datos almacenados y las estructuras que se perderán.

Por favor, elimine una aplicación del simulador y limpie un código y ejecute .it funcione bien. ¿Puede ser su ayuda?

Si estás usando Swift.

Siga la respuesta de @Stas e inserte opciones, en lugar de cero, en su delegado de la aplicación:

 let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true] if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil { 

Prueba “Restablecer contenido y configuración” en el simulador. Funcionó para mí después de eliminar la aplicación y la construcción limpia

Experimenté el mismo problema con mi aplicación (aún no lanzada en App Store).

Así es como lo arreglé:

  1. Ejecutar limpio (Cmd + Shift + K)
  2. Reiniciar iOS Simulator
  3. Simulador de iOS -> Restablecer contenido y configuración (desde la barra de navegación)

(3) fue el paso que finalmente lo hizo funcionar correctamente. ¡Espero que esto ayude!

Aunque a veces puede simplemente eliminar la aplicación del dispositivo al cambiar el esquema en el modelo de objetos administrados, en algunos casos esto no es posible, por ejemplo, porque ya ha publicado su aplicación con un esquema anterior.

Si este es el caso, debe tener cuidado de migrar los datos antiguos al nuevo esquema:

Versión de modelo de datos básicos y migración de datos

Tendrá que migrar el modelo de datos principales mediante la migración. Cada vez que cambia el modelo, lo hace incompatible sin versiones. Ponte el cinturón, es un tema un poco peludo.

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html

Si realiza cambios en su modelo de Datos centrales, debe proporcionar una política de migración que le indique a Core Data cómo adoptar objetos persistentes existentes (que sus usuarios crearon con la versión actualmente disponible) para el nuevo modelo.

Para algunos escenarios, Core Data puede inferir automáticamente la asignación del modelo anterior al nuevo. Para cambios más complejos, es posible que deba implementar alguna lógica que realice la migración.

Los detalles se pueden encontrar en la Guía de progtwigción de versiones de datos y migración de datos del modelo de datos básicos .

Actualizar
Esta respuesta aquí en Stack Overflow cubre los aspectos básicos de la migración liviana de Core Data y también tiene un código para comenzar.

Este problema generalmente ocurre debido a la incompatibilidad entre la versión en la que se ha creado DB . El enfoque general a este problema es eliminar la aplicación y reinstalarla . Pero en su caso mencionado, la versión de DB es completamente diferente en Xcode 3.2 y 4.2. Así que mejor use la misma versión de Xcode para DB.

En primer lugar, las únicas cosas que deberían estar en el paquete xcdatamodel son los archivos xcdatamodel . Tus subclases NO deberían estar en el xcdatamodeld . Saca esos de allí. Hay una buena probabilidad de que estén confundiendo al comstackdor.

Segundo, el error indica que Core Data no puede encontrar su modelo. ¿Has creado datos y luego tocado el modelo? De ser así, se encuentra en un estado incoherente y necesita corregirlo, ya sea borrando los datos (sugeridos por Philippe) o modificando los cambios del modelo ATRÁS .

Me estaba dando el error, pero la razón por la que recibí el error fue por lo siguiente.

Originalmente tenía una Entidad llamada “Entrada” y tenía una fila guardada para esa entidad en la base de datos. Luego agregué otra Entidad llamada “Persona” y después de agregar eso fui a comstackr y obtuve el error. Así que resolví el problema borrando la entidad “Persona” y luego comstackndo la aplicación, borré la fila que estaba en “Entrada” y luego cerré la aplicación. Luego eliminé completamente la aplicación de mi teléfono y luego hice una reconstrucción y funcionó bien. No estoy seguro de qué paso corrigió el problema (la eliminación de la fila o la aplicación), pero con suerte si está buscando una solución, esto ayudará. 🙂

Editar: Ah, y si le preocupaba eliminar su nueva Entidad (en mi caso, “Persona”) para volver a crear la aplicación, recuerde que puede recuperarla después utilizando CMD + Z.

Tuve este problema: primero reinicié mi simulador y luego limpio el proyecto y reconstruyo. Y luego funciona.

Cuando se modifican los datos centrales, (agregando un campo a la tabla, eliminando el campo, etc.), el archivo sqlite en la carpeta del documento de aplicaciones debe estar sincronizado con su esquema.

Este archivo no se sobrescribe de forma predeterminada, este archivo debe regenerarse.

Sigue estos pasos:

  1. Vaya a la carpeta señalada por NSURL. (Esta ruta se puede encontrar en un mensaje de excepción generado por la aplicación antes de bloquearse). Ejemplo: / Usuarios // Biblioteca / Soporte de aplicaciones / Simulador de iPhone // Aplicaciones // Documentos

  2. eliminar o cambiar el nombre del archivo sqlite

  3. Limpiar y volver a ejecutar la aplicación
  4. La ejecución de la aplicación generaría un nuevo archivo sqlite.

Esto asegurará que el esquema y Xcode estén sincronizados.

Para el desarrollo de aplicaciones Mac:

  1. Limpia el proyecto
  2. Limpiar datos derivados
  3. Vaya a / Users / YOUR_NAME / Library / Containers / YOUR_APP_BUNDLE_ID / Data / Documents / y elimine todos los archivos dentro (como “.sqlite”, “.sqlite-shm” …)

Me funcionó, espero que esto pueda ser útil.

Simulador iOS -> Restablecer contenido y configuración …

Trabajó para mi

Simulador iOS -> Restablecer contenido y configuración … -> Restaurar funciona en iOS9 (xcode 7.1) también