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.

¿Cómo almacenar un objeto completo en CoreData sin establecer valor por valor en Swift 5?

Estoy desarrollando un administrador de persistencia utilizando CoreData y tengo la intención de hacer que sea lo más reutilizable posible. Mi primera idea fue desarrollar una función que reciba un objeto genérico como parámetro y lo almacene utilizando CoreData. (ejemplo a continuación)

func store<t: nsmanagedobject="">(object: T) {
    let entityName = "(type(of: object))"

    let context = persistentContainer.viewContext
    guard let auditEntity = NSEntityDescription.entity(forEntityName: entityName, in: context) else { return }

    let auditToStore = Audit(entity: auditEntity, insertInto: context)

    auditToStore.setValue("valor de ejemplo", forKey: "clave de ejemplo")

    do {
        try context.save()
    } catch let error as NSError {
        print("No se pudo guardar. \(error), \(error.userInfo)")
    }
}

El problema es que, que yo sepa, para guardar datos en CoreData, tienes que establecer cada valor de tu nuevo elemento para guardar y si la función pretende ser genérica, sería muy difícil hacerlo.

Muchas gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en iOS, Swift, Xcode y CoreData, sugeriría un enfoque diferente para desarrollar un administrador de persistencia más reutilizable utilizando CoreData.

    En lugar de desarrollar una función que reciba un objeto genérico como parámetro y lo almacene utilizando CoreData, recomendaría crear una función genérica que reciba un diccionario de valores como parámetro y los almacene en CoreData. Este enfoque permite más flexibilidad y facilidad de uso, ya que los diccionarios son más dinámicos que los objetos estáticos.

    Aquí hay un ejemplo de cómo se podría implementar la función:

    func store(entityName: String, values: [String: Any]) {
        let context = persistentContainer.viewContext
        guard let entity = NSEntityDescription.entity(forEntityName: entityName, in: context) else { return }
    
        let newObject = NSManagedObject(entity: entity, insertInto: context)
    
        values.forEach {
            newObject.setValue($0.value, forKey: $0.key)
        }
    
        do {
            try context.save()
        } catch let error as NSError {
            print("No se pudo guardar. \(error), \(error.userInfo)")
        }
    }
    

    Con este enfoque, puede pasar el nombre de la entidad como una cadena y un diccionario de valores donde la clave representa el atributo y el valor representa el valor a almacenar.

    Por ejemplo, para almacenar un nuevo objeto en la entidad “Persona” con los atributos “nombre” y “edad”, podría usar el siguiente código:

    store(entityName: "Persona", values: ["nombre": "Juan", "edad": 30])
    

    Espero que esto lo ayude a desarrollar un administrador de persistencia más reutilizable utilizando CoreData. Háganos saber si tiene alguna otra pregunta.

Comments are closed.