2012-03-20 13 views
9

Tengo una aplicación de datos básicos basada en NSPersistentDocument que apunta a 10.5 Leopard y superior. Estoy a punto de lanzar una actualización que realiza cambios en el modelo de datos y, por lo tanto, debe migrar los documentos existentes al nuevo modelo. Los cambios son relativamente sencillos y he creado un modelo de mapeo para ellos. Tenga en cuenta que no estoy tratando de hacer una migración liviana automática, sí tengo un modelo de mapeo (la migración liviana no es compatible con Leopard, pero los cambios en mi modelo lo descartan de todos modos). En mi subclase NSPersistentDocument, puedo reemplazar -configurePersistentStoreCoordinatorForURL... de la siguiente manera:La migración automática de datos centrales falla en Mac OS X 10.5 pero no en 10.6 o 10.7

- (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url 
              ofType:(NSString *)fileType 
           modelConfiguration:(NSString *)configuration 
            storeOptions:(NSDictionary *)storeOptions 
              error:(NSError **)error 
{ 

    NSMutableDictionary *newOptions = (storeOptions ? 
             [NSMutableDictionary dictionaryWithDictionary:storeOptions] : 
             [NSMutableDictionary dictionary]); 
    [newOptions setObject:(id)kCFBooleanTrue forKey:NSMigratePersistentStoresAutomaticallyOption]; 
    return [super configurePersistentStoreCoordinatorForURL:url 
                ofType:fileType 
             modelConfiguration:configuration 
               storeOptions:newOptions 
                 error:error]; 

} 

Esto funciona bien en 10.6 y 10.7. Sin embargo, en 10.5, la llamada a [super configurePersistentStore...] arroja una excepción y falla. El error es:

Error Domain=NSCocoaErrorDomain Code=134020 UserInfo=0x15812d70 "The model configuration used to open the store is incompatible with the one that was used to create the store." 

Si en cambio se inicio la migración manualmente, utilizando este código:

NSArray *bundles = [NSArray arrayWithObject:[NSBundle mainBundle]]; 
NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:bundles forStoreMetadata:sourceMetadata]; 
NSManagedObjectModel *destinationModel = [psc managedObjectModel]; 
NSMappingModel *mappingModel = [NSMappingModel mappingModelFromBundles:bundles forSourceModel:sourceModel destinationModel:destinationModel]; 

NSMigrationManager *migrationManager = [[[NSMigrationManager alloc] initWithSourceModel:sourceModel destinationModel:destinationModel] autorelease]; 
BOOL migrationSuccessful = [migrationManager migrateStoreFromURL:backupURL 
                  type:NSXMLStoreType 
                 options:storeOptions 
               withMappingModel:mappingModel 
               toDestinationURL:url 
               destinationType:NSXMLStoreType 
               destinationOptions:storeOptions 
                  error:error]; 

return [psc addPersistentStoreWithType:NSXMLStoreType configuration:configuration URL:url options:storeOptions error:error] != nil; 

la migración funciona bien. Sin embargo, preferiría usar la migración automática, aunque solo sea porque genera un código más limpio. ¿Alguien ha visto un problema similar con la migración automática que funciona en 10.6+ pero no en 10.5? Mi corazonada es que es algo bastante simple, como el código de migración incorporado no puede encontrar el modelo de mapeo por algún motivo, pero no puedo entender cuál debe ser.

+0

Tuve exactamente el mismo problema y solución (entonces el departamento de marketing decidió dejar de dar soporte a OS X 10.5, así que terminé eliminando el código de migración manual). – cdelacroix

+0

Supongo que las características/robustez de la migración automática se han agregado después de 10.5 ... – nielsbot

+0

Estoy seguro de que sí, pero no estoy haciendo algo tan complicado como para esperar que falle. De todos modos, en el próximo lanzamiento, esta aplicación será solo 10.6+, por lo que ya no es un problema, y ​​eliminaré el código de migración manual actual en algún momento. Sin embargo, sería bueno saber por qué sucedió esto. –

Respuesta

1

No estoy 100% relacionado con su problema, pero hay una solución documentada de Apple sobre cómo migrar modelos de Core Data para 10.6 que también deben ser compatibles con 10.5. Parece que falta un método en 10.5 del que 10.6 se basa para la migración.

destinationInstancesForSourceRelationshipNamed:sourceInstances:

es el método que falta.

Espero que esto ayude.

Referencia: http://developer.apple.com/library/mac/#/legacy/mac/library/releasenotes/Cocoa/MigrationCrashBuild106Run105/_index.html

+0

Gracias por la respuesta. Pasamos a requerir 10.6 para la última versión de esta aplicación, por lo que ya no es un problema. En cualquier caso, no creo que este sea el mismo problema, ya que estaba viendo esto incluso cuando se construye en 10.5. Por cierto, el enlace que publicaste en realidad no funciona. Simplemente va a la página de búsqueda de documentación del desarrollador de Apple. –

+1

Valió la pena intentarlo. No estoy seguro de por qué el enlace no funciona. Google-ing "Core Data migration 10.5 10.6" abre el enlace adecuado a la documentación de Apple sobre esto. – macandyp

Cuestiones relacionadas