es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
enter image description here

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

Tags:  , ,

Answer

  1. Avatar for 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:):

    override func createRelationships(forDestination dInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
        // verifica si la entidad de destino es la entidad objetivo de la relación que nos interesa
        guard let destEntityName = dInstance.entity.name,
            destEntityName == "DestinationEntity" else {
            // no es la entidad objetivo, omite la creación de la relación
            return
        }
    
        let sourceEntityName = mapping.sourceEntityName
        let keyPath = "newRelationship"
    
        // recupera el objeto antiguo
        guard let sInstance = manager.sourceInstances(forEntityMappingName: mapping.name, destinationInstances: [dInstance]).first else {
            throw MigrationError.unableToRetrieveSourceInstance
        }
    
        // crea un nuevo objeto predeterminado para la nueva relación
        let defaultObject = try migrate_createDefaultObject(forInstance: sInstance, manager: manager)
    
        // establece la relación entre los objetos antiguo y nuevo
        dInstance.setValue(defaultObject, forKey: keyPath)
    }
    

    En el ejemplo anterior, DestinationEntity es la entidad que tiene la nueva relación requerida, y newRelationship 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.

Comments are closed.