64 votos

iPhone de Datos Básicos "Automático Ligero Migración"

Estoy intentando actualizar una aplicación que implementa un núcleo de almacén de datos. Voy a añadir un atributo a una de las entidades.

He añadido el siguiente código a mi delegado de clase:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

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

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

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

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

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

    return persistentStoreCoordinator;
}

Esto fue a partir de la siguiente URL: Doc

Me sale el siguiente error al ejecutar el código:

2009-12-01 20:04:22.877

Shoppee[25633:207] Error: Error

Dominio=NSCocoaErrorDomain Código=134130

UserInfo=0x1624d20 "la Operación no se pudo completar. (Cacao error 134130.)" 2009-12-01 20:04:22.879 Shoppee[25633:207] sin resolver error Error Domain=NSCocoaErrorDomain Código=134130 UserInfo=0x1624d20 "La operación no se pudo completar. (Cacao error 134130.)", { URL = file://localhost/Users/Eric/Library/Application%20Support/iPhone%20Simulator/User/Applications/A8A8FB73-9AB9-4EB7-8F83-82F5B4467AF1/Documentos/MyApp.sqlite; metadatos = { NSPersistenceFrameworkVersion = 241; NSStoreModelVersionHashes = { Item = <869d4b20 088e5c44 5c345006 87d245cd 67ab9bc4 14cadf45 180251e9 f741a98f>; Tienda = <47c250f4 895e6fd1 5033ab42 22d2d493 7819ba75 3c0acffc 2dc54515 8deeed7a>; }; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers = ( ); NSStoreType = SQLite; NSStoreUUID = "8DC65301-3BC5-42BE-80B8-E44577B8F8E1"; }; razón = "no se Puede encontrar el modelo de almacén de origen"; }

Parece que de alguna manera se debe incluir el modelo de datos original, pero no estoy seguro de cómo hacerlo. Alguna sugerencia?

143voto

Stian Høiland Puntos 1699

Para recapitular/guía Completa:

  1. Antes de hacer cualquier cambio, crear una nueva versión del modelo.

    En Xcode 4: Seleccione su .xcdatamodel -> Editor -> Agregar Versión del Modelo.

    En Xcode 3: Diseño -> Modelo De Datos -> Agregar Versión Del Modelo.

    Verás que una nueva .xcdatamodel se crea en su .xcdatamodeld carpeta (que también se crea si usted no tiene ninguno).

  2. Guarde.

  3. Seleccione su nueva .xcdatamodel y hacer el cambio que quieres emplear, de conformidad con el Ligero Migración de la documentación.

  4. Guarde.

  5. Establecer la corriente/activo esquema de la recién creada esquema.

    Con el .xcdatamodeld carpeta seleccionada:

    En Xcode 4: Utilidades de la barra lateral -> Inspector de Archivo -> Versionada Núcleo del Modelo de Datos -> Seleccione el nuevo esquema.

    En Xcode 3: Diseño > > Modelo De Datos > Definir La Versión Actual.

    La marca verde en la .xcdatamodel icono de mover al nuevo esquema.

  6. Guarde.

  7. Implementar el código necesario para realizar la migración en tiempo de ejecución.

    Donde su NSPersistentStoreCoordinator es creado (generalmente de clase AppDelegate), para la options parámetro, reemplace nil con el siguiente código:

    [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                      [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
    
  8. Ejecutar su aplicación. Si no hay ningún accidente, usted probablemente ha migrado con éxito :)

  9. Cuando haya migrado correctamente, el código de migración (paso 7) puede ser eliminado. (El desarrollador para determinar cuándo los usuarios de una aplicación publicada puede considerarse que han emigrado.)

IMPORTANTE: no elimine viejo modelo de versiones/esquemas. Datos principales necesidades de la versión antigua a migrar a la nueva versión.

26voto

Eric Puntos 714

Yo pense que fuera.

Diseño> Modelo de Datos> Añadir la versión de modelo

16voto

davetron5000 Puntos 9622

Para los Empleados de nuevo, esto es lo que hay que hacer (suponiendo que usted ya ha configurado Ligero de Migración):

  1. Antes de hacer cambios, Hacer el Diseño -> Modelo de Datos -> Agregar Versión del Modelo (verás que una nueva .xcdatamodel se crea en su .xcdatamodeld carpeta)
  2. Guardar
  3. Realice su cambio
  4. Guardar
  5. Ejecutar La Aplicación

Paso #1 es crucial para hacer este trabajo. Me encontré con este problema porque yo había seguido estos pasos para agregar un nuevo campo. Que trabajó. He añadido un segundo campo nuevo, pero se olvidó de "Agregar Versión del Modelo", y cosas explotó.

11voto

Gmu Puntos 328

También para Googlers .. regla simple, nunca eliminar / editar cualquier edad versión numerada. Cuando se agrega la versión de modelo el sufijo número aumentará a medida que 2..3..4 significado 2 es la más antigua de 3 siguiente etc .. pero el actual para editar es la versión sin numerar.

No elimine las versiones antiguas como modelo los usuarios con db anterior utilizando una versión viejo modelo no podrán migrar a su modelo más reciente con db cabo comparando viejo y noticias de esquemas.

5voto

rustyshelf Puntos 16336

Sólo una nota para aquellos que vienen a través de este googlear, parece incluso con auto (magia) la migración usted todavía tiene que crear una versión de su tienda original, y uno nuevo, y establecer la nueva como la versión actual.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X