transferir pasar para migrar funciona datos como app aplicacion iphone iphone-sdk-3.0 core-data core-data-migration

pasar - transferir datos de android a iphone



Detectar una migración de datos de núcleo ligero (3)

Estoy usando la migración ligera automática de Core Data con éxito. Sin embargo, cuando una entidad en particular se crea durante una migración, me gustaría rellenarla con algunos datos. Por supuesto, podría comprobar si la entidad está vacía cada vez que se inicia la aplicación, pero esto parece ineficaz cuando Core Data tiene un marco de migración.

¿Es posible detectar cuándo se produce una migración ligera (posiblemente utilizando KVO o notificaciones), o esto requiere la implementación de migraciones estándar?

He intentado usar el NSPersistentStoreCoordinatorStoresDidChangeNotification , pero no se dispara cuando se producen migraciones.


¿Qué pasa con la subclasificación de NSManagedObject para esa entidad, y luego invalidar -awakeFromInsert :? ¿O estás creando esta entidad en otras partes de tu aplicación?


La respuesta aceptada convertida a Swift ...

var persistentStoreCoordinator: NSPersistentStoreCoordinator? var url: URL do { let sourceMetadata = try NSPersistentStoreCoordinator.metadataForPersistentStore(ofType: NSSQLiteStoreType, at: url, options: nil) if let destinationModel = persistentStoreCoordinator?.managedObjectModel { let compatibile = destinationModel.isConfiguration(withName: nil, compatibleWithStoreMetadata: sourceMetadata) if !compatibile { if let versionHashes = sourceMetadata["NSStoreModelVersionHashes"] as? [String: Any] { let sourceEntities = Set(versionHashes.keys) let destinationEntities = Set(destinationModel.entitiesByName.keys) var addedEntities = Set(destinationEntities) addedEntities.subtract(sourceEntities) var removedEntities = Set(sourceEntities) removedEntities.subtract(destinationEntities) let modelName = (destinationModel.versionIdentifiers.first as? String) ?? "" NSLog("Core Data requires a migration to model ''/(modelName)''.../nAdded: /(addedEntities)/nRemoved: /(removedEntities)") } } } } catch { ... }


Para detectar si se necesita una migración, verifique si el modelo de objetos administrados del coordinador de tienda persistente es compatible con los metadatos de la tienda existente (adaptado de la migración de Apple es necesaria ):

NSError *error = nil; persistentStoreCoordinator = /* Persistent store coordinator */ ; NSURL *storeUrl = /* URL for the source store */ ; // Determine if a migration is needed NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeUrl error:&error]; NSManagedObjectModel *destinationModel = [persistentStoreCoordinator managedObjectModel]; BOOL pscCompatibile = [destinationModel isConfiguration:nil compatibleWithStoreMetadata:sourceMetadata]; NSLog(@"Migration needed? %d", !pscCompatibile);

Si pscCompatibile es NO , será necesario realizar una migración. Para examinar los cambios de la entidad, compare la clave NSStoreModelVersionHashes en el diccionario de sourceMetadata con las [destinationModel entities] :

NSSet *sourceEntities = [NSSet setWithArray:[(NSDictionary *)[sourceMetadata objectForKey:@"NSStoreModelVersionHashes"] allKeys]]; NSSet *destinationEntities = [NSSet setWithArray:[(NSDictionary *)[destinationModel entitiesByName] allKeys]]; // Entities that were added NSMutableSet *addedEntities = [NSMutableSet setWithSet:destinationEntities]; [addedEntities minusSet:sourceEntities]; // Entities that were removed NSMutableSet *removedEntities = [NSMutableSet setWithSet:sourceEntities]; [removedEntities minusSet:destinationEntities]; NSLog(@"Added entities: %@/nRemoved entities: %@", addedEntities, removedEntities);