Mi aplicación se encuentra actualmente en la tienda de aplicaciones, y la estoy actualizando con un único Atributo agregado al modelo de datos. Agregué una versión modelo y la configuré a la corriente.Problema de migración ligera de Core Data
Todo funciona, pero cuando pruebo la instalación de una nueva versión de la aplicación sobre una versión anterior que contiene datos, la aplicación no se carga sin mensajes de error. Continuará fallando (solo parpadeará brevemente en la pantalla) hasta que reinicie el dispositivo o vuelva a instalar la aplicación actualizada, ya sea a través de XCode o iTunes, luego la aplicación se ejecutará correctamente y los datos se migrarán correctamente.
Mi temor es que si esto les sucede a los clientes, eliminarán la aplicación antes de volver a instalarla y perderán todos sus datos. ¿Alguien tiene alguna idea? Cualquier ayuda se agradece
Gracias, estoy usando el siguiente código en la App Delegado para la migración de datos:
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
NSString *path = [[NSBundle mainBundle] pathForResource:@"DataStore" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
return managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DataStore.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"DataStore" ofType:@"sqlite"];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}
}
NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],
NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES],
NSInferMappingModelAutomaticallyOption, nil];
NSError *error;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
return persistentStoreCoordinator;
}
Gracias por su respuesta, volví a consultar los modelos de datos y parece correcto. También volví a mi versión anterior lanzada y pasé por el proceso de agregar una nueva versión de datos nuevamente con los mismos resultados. –
¿Tiene alguna sugerencia sobre por qué fundamentalmente no funcionaría la primera vez, pero luego funciona bien con la migración exitosa la segunda vez? Debe haber algo que pueda hacer para asegurarme de que funciona la primera vez, ¿tal vez el modelo de datos original no se está leyendo correctamente o algo así? –
Ciertamente, está diseñado para funcionar la primera vez. He utilizado este tipo de migración con éxito sin problemas en la aplicación que estoy construyendo. ¿Es posible que el atributo recién creado no se inicialice correctamente cuando se produce la migración? es decir, ¿espera algún valor que se está configurando en insertar en lugar de buscar? ¿Ha sincronizado su aplicación para que no haga nada más que intentar la migración y mostrar un simple controlador de visualización? Parece que algo accede a los datos después de que la migración está causando el bloqueo. – DigitalBytes