2010-12-09 19 views
5

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; 
} 

Respuesta

1

¿Seguro que usted ha hecho ningún cambio en la versión anterior de su modelo? Este comportamiento parece que Core Data no puede encontrar un modelo para la tienda persistente que tiene en el dispositivo.

Debería poder ver cualquier error de Datos centrales en el registro de la consola cuando inicie la aplicación que contiene una versión anterior de su tienda persistente.

¿En qué momento agregó su nuevo atributo? Si lo agregó antes de crear la nueva versión, tanto la versión anterior como la nueva tendrían el atributo. Verifique su modelo anterior y asegúrese de que el nuevo atributo no esté allí.

+0

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. –

+0

¿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í? –

+0

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

1

Me encontré con este problema también. El proyecto predeterminado generado utilizando datos básicos no se cortó ni siquiera por las migraciones simples pero este artículo por Jeff LaMarche me ayudaron a conseguir cosas de trabajo:

http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html

Todo lo que tenía que hacer era la versión del modelo, Hacer estos cambios , y cambiar el código y funcionó. ¡Espero que ayude!

+0

Gracias, me referí a ese artículo cuando estaba preparando la migración y me ayudó. Para que quede claro, la migración funciona, pero por alguna razón tengo que instalar la aplicación dos veces para que realmente se lance. –

0

No olvide que también necesita los esquemas de origen y de destino disponibles en su aplicación para que la migración funcione.

+0

Gracias, sí, los dos están allí. Una vez más, la migración funciona, con el nuevo atributo disponible, pero tengo que instalar la aplicación dos veces o reiniciar el dispositivo para que se inicie la aplicación. –

Cuestiones relacionadas