Pregunta Manejo de errores en addPersistentStoreWithType


Estoy tratando de encontrar información sobre el manejo de errores al crear un coordinador de tienda persistente en el iPhone. Implementé la migración ligera

   NSError *error = nil;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
    /*
     Replace this implementation 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. 

     Typical reasons for an error here include:
     * The persistent store is not accessible;
     * The schema for the persistent store is incompatible with current managed object model.
     Check the error message to determine what the actual problem was.


     If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory.

     If you encounter schema incompatibility errors during development, you can reduce their frequency by:
     * Simply deleting the existing store:
     [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]

     * Performing automatic lightweight migration by passing the following dictionary as the options parameter:
     @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}

     Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.

     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return _persistentStoreCoordinator;

Esto se basa en el código de Apple con el soporte adicional para la migración liviana.

No puedo encontrar ninguna información sobre el manejo de errores si la aplicación todavía encuentra un error aquí. Me parece que si la base de datos no se puede crear, la aplicación no se puede usar en absoluto.

  • ¿Solo le pido al usuario que intente reinstalar la aplicación y mostrar información relevante?
  • ¿Puedo mantener la instrucción abort () mientras agrego un aviso sobre el error o esto ocasionará que la aplicación sea rechazada por Apple?

6
2017-12-10 18:22


origen


Respuestas:


Llamar a abort () en esta situación está fuera de toda duda. Cualquier aplicación que se cuelgue será rechazada por Apple. Y no resuelve el problema: al volver a iniciar la aplicación encontrará el mismo archivo de tienda y, por lo tanto, volverá a fallar.

Por la misma razón, reinstalar la aplicación no ayuda, y sería una mala experiencia para el usuario.

Por supuesto, la situación no debería ocurrir si la migración ha sido probada. Pero si se produce este error fatal y su aplicación no puede abrir la base de datos, debe crear una nueva base de datos.

Los pasos exactos a seguir dependen de lo que se almacena en la base de datos y de si / cómo puede recuperar los datos. Entonces podrías

  • eliminar el archivo de base de datos anterior con [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]o copie un archivo de base de datos predeterminado de los recursos de su programa a storeURL,
  • llamada _persistentStoreCoordinator addPersistentStoreWithType:... nuevamente para abrir la nueva base de datos.
  • quizás vuelva a llenar la base de datos con datos de un servidor, o lo que sea necesario para recrear los datos.

15
2017-12-10 19:22