Insertando una instancia de relación predeterminada durante la migración personalizada de Core Data.
TLD;DR: Durante la migración de Core Data, ¿cómo se inserta adecuadamente una instancia predeterminada para la nueva relación?
He añadido una nueva relación requerida en mi modelo de Core Data. Durante el proceso de migración personalizada, quiero crear un valor predeterminado para esa migración en las entidades antiguas. Sin embargo, cuando la migración termina, no puedo recuperar esos objetos nuevos.
Aquí está cómo configuro una expresión de asignación de relaciones:
FUNCTION($entityPolicy, "migrate_createDefaultAudioMixWithSource:manager:error:" , $source, $manager)
Aquí está mi política de migración personalizada:
class MigrationPolicy_11To12: NSEntityMigrationPolicy {
<pre><code>@objc(migrate_createDefaultAudioMixWithSource:manager:error:)
func migrate_createDefaultAudioMix(source sInstance: NSManagedObject, manager: NSMigrationManager) throws -> NSManagedObject {
let newObject = NSEntityDescription.insertNewObject(forEntityName: "TrackAudioMixParametersEntity",
into: manager.destinationContext)
newObject.setValue(UUID(), forKey: "id")
return newObject
}
</code></pre>
}
La migración es exitosa y el nuevo objeto es añadido correctamente. Sin embargo, cuando intento acceder a sus propiedades, Core Data muestra un error y devuelve solo nils
.
let _ = track.audioMixParameters.id // devuelve nil y muestra un error
CoreData: fault: entityForObjectID falló al recuperar una NSSQLEntity para el objectID 0xb3078b67b6cedaf5 <x-coredata://D09D6224-6549-43A2-A7AC-01F40D231C89/TrackAudioMixParametersEntity/p1>
CoreData: fault: _sqlCoreLookupSQLEntityForEntityDescription fallió al devolver un resultado para el objectID 0xb3078b67b6cedaf5
davy.ai
Para insertar adecuadamente una instancia predeterminada para la nueva relación durante la migración de Core Data, es necesario asegurarse de establecer correctamente el tipo del objeto predeterminado. En este caso, asegúrese de que el tipo del objeto predeterminado creado por
migrate_createDefaultAudioMix
coincida con el tipo de la entidad de destino.Además, también debe asegurarse de establecer adecuadamente la relación entre la entidad antigua y el nuevo objeto predeterminado. Una forma de hacer esto es anular el método
createRelationships(forDestination:in:)
en su política de migración para crear la relación entre la entidad antigua y el nuevo objeto predeterminado.Aquí hay un ejemplo de implementación del método
createRelationships(forDestination:in:)
:En el ejemplo anterior,
DestinationEntity
es la entidad que tiene la nueva relación requerida, ynewRelationship
es el nombre de la relación.Al establecer correctamente el tipo del objeto predeterminado y establecer la relación entre la entidad antigua y el nuevo objeto predeterminado, debería poder recuperar los nuevos objetos después de la migración.