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.

La forma correcta de crear una referencia a un objeto en Realm.

Creé una aplicación de fitness y utilizo Realm como base de datos local. Durante el primer lanzamiento, quiero reemplazar el Realm predeterminado con un archivo de Realm que contenga datos iniciales (nombres de ejercicios, equipos, músculos involucrados, etc.). Estos datos iniciales no cambiarán en el futuro. Me pregunto si existe alguna forma que pueda ayudarme a crear una referencia en la clase principal a otras clases más pequeñas. Necesito esto para facilitar la filtración y obtención de datos.

Esta es mi clase de Realm principal:

     class Exercise: Object {
        @Persisted var exerciseID: Int = 0
        @Persisted var name: String = ""
        @Persisted var category: Int
        @Persisted var equipment: String
        @Persisted var instruction: String
        @Persisted var muscle: String
        @Persisted var gif: String?
        @Persisted var image: String? = nil

        convenience init(name: String, category: Int, equipment: String, instruction: String, muscle: String, gif: String?, image: String?) {
            self.init()
            self.name = name
            self.category = category
            self.equipment = equipment
            self.instruction = instruction
            self.muscle = muscle
            self.gif = gif
            self.image = image
        }

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

Cuando quiero obtener todos los ejercicios y los equipos y músculos asignados, es realmente mucho código para recuperar estos datos, especialmente cuando la cadena contiene algunas referencias a objetos.

 var exercises = [Exercise]()
    var equipments = [Equipment]()

    func getAllExercises() {

            let data = RealmService.shared.realm.objects(Exercise.self)
            exercises = data.compactMap({$0})

            let equipment = exercises.compactMap({$0.equipment})

            for eq in exercises.compactMap({$0.equipment}) {
                let numberOfEquipment = eq.components(separatedBy: ",")       

                for number in numberOfEquipment {

                    guard let intNumber = Int(number) else { return }
                    guard let finalEquipment = RealmService.shared.realm.object(ofType: Equipment.self, forPrimaryKey: intNumber) else { return }
                    equipments.append(finalEquipment)
                }
            }

¿Quizás la mejor opción sea simplemente insertar valores en lugar de referencias de objeto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Uso de Realm en una aplicacion de Fitness

    Como experto en IT especializado en iOS, Swift y Realm, estas construyendo una aplicacion de Fitness que utiliza Realm como base de datos local. Durante el primer lanzamiento, deseas reemplazar el Realm predeterminado con un archivo Realm que contenga los datos iniciales que no cambiaran en el futuro. Te preguntas si hay alguna manera de crear una referencia en la clase principal a otras clases mas pequeñas para facilitar el filtrado y obtencion de datos.

    Creando una clase Realm

    La clase Ejercicio es la clase principal en tu aplicacion de Realm. Puedes usar el metodo convenience init para definir los datos iniciales que se utilizaran durante el primer lanzamiento de la aplicacion:

    class Ejercicio: Object {
        // define propiedades aqui
        convenience init(name: String, category: Int, equipment: String, instruction: String, muscle: String, gif: String?, image: String?) {
            self.init()
            self.name = name
            self.category = category
            self.equipment = equipment
            self.instruction = instruction
            self.muscle = muscle
            self.gif = gif
            self.image = image
        }
    }
    

    Recuperando datos de Ejercicio

    Para recuperar todos los ejercicios y los equipos y musculos asignados, puede usar una combinacion de consultas Realm y ciclos for. Aqui hay un ejemplo:

    var ejercicios = [Ejercicio]()
    var equipos = [Equipo]()
    
    func getTodosLosEjercicios() {
        // obtener todos los ejercicios
        let data = RealmService.shared.realm.objects(Ejercicio.self)
        ejercicios = data.compactMap({$0})
    
        // obtener todos los equipos y musculos
        let equipment = ejercicios.compactMap({$0.equipment})
        let muscle = ejercicios.compactMap({$0.muscle})
    
        // obtener todos los objetos de equipo
        for eq in equipment {
            let numberOfEquipment = eq.components(separatedBy: ",")
            for number in numberOfEquipment {
                guard let intNumber = Int(number) else { return }
                guard let finalEquipment = RealmService.shared.realm.object(ofType: Equipo.self, forPrimaryKey: intNumber) else { return }
                equipos.append(finalEquipment)
            }
        }
    
        // obtener todos los objetos de musculo
        for mus in muscle {
            let numberOfMuscles = mus.components(separatedBy: ",")
            for number in numberOfMuscles {
                guard let intNumber = Int(number) else { return }
                guard let finalMuscle = RealmService.shared.realm.object(ofType: Musculo.self, forPrimaryKey: intNumber) else { return }
                muscles.append(finalMuscle)
            }
        }
    }
    

    Este codigo recupera todos los ejercicios, equipos y musculos de la base de datos Realm e inserta las referencias en arreglos para facilitar el filtrado y la obtencion de datos. Tenga en cuenta que este enfoque requiere mas codigo, pero le permite usar referencias de objetos en lugar de simplemente insertar valores.

    En general, aprovechar el poder de la base de datos local de Realm para su aplicacion de Fitness proporciona una solucion robusta y escalable para el almacenamiento, recuperacion y manipulacion de datos.

Comments are closed.