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.

Eliminar objeto de reino por valor

Comencé a probar Realm para IOS, así que creé dos clases:

Modelo de archivos

import Foundation
import RealmSwift

class FilesModel: Object {

    @objc dynamic var id : Int = 0
    @objc var fileName = ""
    @objc dynamic var dateOfCreation = Date()
    @objc dynamic var dateOfModification = Date()
    @objc dynamic var type = ""
    var file = List<data>()

}

Modelo de grupos

import Foundation
import RealmSwift

class GroupsModel: Object {

    @objc dynamic var id : Int = 0
    @objc dynamic var name = ""
    @objc dynamic var dateOfCreation = Date()
    @objc dynamic var dateOfModification = Date()
    @objc dynamic var filesCount = Int()
    var files = List<filesmodel>()

    override static func primaryKey() -> String? {
        return "id"
    }
}

Ahora el problema es que estoy copiando archivos dentro del objeto de modelo de grupo de archivos, pero necesito eliminar el objeto padre. Piense en ello como una movida, estoy moviendo archivos a la carpeta. Lo que he hecho es guardar una copia del archivo en la carpeta y eliminar el archivo desde fuera de la carpeta.

El problema es que cuando elimino el archivo fuera de la carpeta, también se elimina el archivo de dentro.

Mi comprensión del problema es que las clases son un tipo de referencia, por lo que estoy copiando una referencia. Entonces, cuando elimino la referencia, se eliminará el archivo del proyecto completo.

He intentado muchas soluciones como la copia profunda y desconectada.

Gracias de antemano.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Solución para eliminar un objeto padre sin afectar al objeto hijo

    El problema al eliminar el objeto padre y el objeto hijo es que ambos son tipos de referencia. Al eliminar el objeto padre, se elimina de la memoria y también la referencia al objeto hijo. Por lo tanto, al intentar acceder al objeto hijo, se produce un error porque ya no existe.

    Una solución a este problema es copiar el objeto hijo antes de eliminar el objeto padre. Esto creará una nueva referencia al objeto hijo, que no se verá afectado por la eliminación del objeto padre. Luego puedes agregar este objeto hijo copiado a un nuevo objeto padre o mantenerlo como un objeto independiente.

    Para lograr esto, puedes utilizar el método create de Realm, que permite crear un nuevo objeto Realm con las mismas propiedades que un objeto existente. Aquí hay un ejemplo de fragmento de código:

    let realm = try! Realm()
    let fileToDelete = realm.object(ofType: FilesModel.self, forPrimaryKey: fileId)
    
    let copiedFile = realm.create(FilesModel.self, value: fileToDelete!.value, update: .all)
    // Esto crea un nuevo objeto con las mismas propiedades que `fileToDelete`
    
    try! realm.write {
        realm.delete(groupToDelete)
        // Ahora, `fileToDelete` ha sido eliminado del objeto padre
    }
    
    // `copiedFile` es ahora un objeto independiente que se puede agregar a un nuevo objeto padre o mantener como está
    

    En este fragmento de código, fileToDelete es el objeto hijo que se quiere copiar antes de eliminar el objeto padre. El método realm.create crea un nuevo objeto FilesModel con las mismas propiedades que fileToDelete y devuelve una referencia al nuevo objeto. Ahora puedes eliminar el objeto padre sin afectar al objeto hijo.

    Después de eliminar el objeto padre, copiedFile es ahora un objeto independiente que se puede agregar a un nuevo objeto padre o mantener como un objeto independiente.

    ¡Espero que esto ayude! Hazme saber si tienes alguna pregunta adicional.

Comments are closed.