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);