2010-09-24 19 views
8

tengo una aplicación de iPhone que utiliza CoreData. Recientemente realicé algunos cambios menores en el modelo de datos y ahora, cada vez que se abre la aplicación, aparece el error "No se puede encontrar el modelo para la tienda de origen".migración iPhone CoreData falla con "No se puede encontrar el modelo de almacén de origen"

tengo la versión 2 del modelo de datos y los únicos cambios que he hecho había algunas adiciones de algunos campos. Estaba siguiendo la guía here que funcionó inicialmente, luego solo hoy, después de agregar algunos campos adicionales, se rompe. Todos los campos adicionales están marcados como opcionales y todos tienen valores predeterminados. El código de la migración es a continuación:

NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"xxx.sqlite"]]; 

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

NSError *error = nil; 
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
... 
} 

la managedObjectModel se crea correctamente aquí:

- (NSManagedObjectModel *)managedObjectModel { 

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

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

return managedObjectModel; 
} 

He rastreado el problema a una falta de coincidencia en la versión tiene de 1 entidad. El error que se tira incluye esto tiene para la entidad:

MyEntityName = <cc1456b7 b12d0d05 21930308 94ccc078 27a6c345 8847c738 e3a9ae7e 0be9535d>; 

pero el hash en el VersionInfo.plist en el paquete de aplicación es:

MyEntityName = <fede6b59 462442d1 8fc98226 b9f8f745 3250dabd ee188248 cb97b1d0 8a74eef3>; 

No hay otras entidades en cualquier parte del VersionInfo. plist con el hash <cc1456b7....>.

Respuesta

5

De la respuesta vinculado,

Esto parece grande y tan simple como que quería - pero creo que hay que tener cuidado durante el desarrollo a medida que cambia un modelo - de lo contrario, tendrá que crear una nueva versión por cada cambio

Parece que creó la versión 2, la versión editada 2, ejecutó la aplicación, volvió a editar la versión 2 y volvió a ejecutar la aplicación. Esto no funciona tan bien; debe guardar todas las versiones del modelo que espera poder abrir. Esto es un poco molesto.

Lo que podría hacer es el nombre de todos sus modelos después de versiones de aplicaciones, por ejemplo, FooModel-1 y FooModel-1.1 correspondientes a versiones, y FooModel-1.2d1, FooModel-1.2d2 para versiones de "desarrollo". Antes del lanzamiento, puede cambiar el nombre de FooModel-1.2d10 a FooModel-1.2 y eliminar las otras versiones de desarrollo.

(O podría ser mala interpretación por completo la cuestión;. Lo siento)

+0

Definitivamente edité la versión 2 después de ejecutar la aplicación. ¿Cuál sería la mejor manera de seguir adelante con esto? Definitivamente no quiero lanzar esto en producción y hacer que los usuarios pierdan sus datos porque cometí un error durante el desarrollo. ¿Podría crear una versión 3 con las ediciones finales y estar listo para continuar? –

+0

Si no ha lanzado la versión 2 a los usuarios, entonces no tendrán ningún problema. Estás teniendo problemas porque has guardado con "versión anterior 2" y estás intentando cargarlo con "nueva versión 2". Sin embargo, agregar versiones de modelos innecesarios no duele; solo hace que tu aplicación sea un poco más grande. –

+0

Excelente. Me estaba volviendo un poco loco ya que algunos de nuestros evaluadores internos estaban recibiendo errores, pero probablemente debido al mismo problema que tenía al ejecutar una versión con múltiples cambios. –

0

Bueno, en mi caso, exactamente lo mismo que sucedía y yo estaba en iOS 7 y este problema jodido mi cabeza por lo menos durante una semana y luego finalmente encuentre la solución que funciona para mí . Con el fin de hacer que funcione hay que añadir un valor extra en las opciones que se utiliza para agregar PersistentStore y luego vas (no estoy seguro acerca de otra versión de IOS, pero sí que definitivamente va a trabajar en iOS 7).

-(NSManagedObjectModel *)managedObjectModel 
{ 
    if (managedObjectModel != nil) 
    { 
     return managedObjectModel; 
    } 
    managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 
    return managedObjectModel; 
} 

-(NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 

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

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ABC.sqlite"]; 

    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] ini tWithManagedObjectModel:[self managedObjectModel]]; 

//Creating Lightweight migration. 
    NSDictionary *options = 
    @{ 
     NSMigratePersistentStoresAutomaticallyOption:@YES 
     ,NSInferMappingModelAutomaticallyOption:@YES 
     ,NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"} 
    }; 


    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
    { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
return persistentStoreCoordinator; 
} 
Cuestiones relacionadas