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.
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
Supongo que las características/robustez de la migración automática se han agregado después de 10.5 ... – nielsbot
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. –