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.

Consulta de Firebase en Swift 5 por child/key

En mi base de datos, todas las imágenes publicadas tienen asociado un número creciente como clave.

Entonces, la primera imagen tiene la clave “1”, la segunda “2”, la milésima imagen tiene la clave “1000”.

Ahora quiero consultarlas ordenadas por orden ascendente, incluyendo paginación. Es decir, empezar con las 10 más recientes, luego continuar con las imágenes 11-20 y así sucesivamente.

¿Cómo puedo lograrlo sin utilizar una clave secundaria para realizar la consulta? Actualmente necesito darle una clave secundaria (por ejemplo “id” y luego la clave) para poder hacer la consulta. Como la base de datos está creciendo rápidamente, esto llevará a guardar datos innecesarios.

Ejemplo:

"root" {
"images" {
"1" {
"id" : 1
}
"2" {
"id" : 2
}

etc.

Quiero eliminar la parte del “id” y seguir siendo capaz de hacer la consulta y la paginación.

Actualmente sólo puedo hacer la consulta correctamente cuando incluyo la parte del “id”.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una manera de lograr el ordenamiento y paginación sin usar un nodo hijo para la consulta es usar una combinación de los métodos queryOrderedByKey() y queryLimited(toLast:) proporcionados por Firebase Realtime Database para Swift. Aquí hay un ejemplo de código que demuestra su uso:

    // Referencia al nodo "images" en la base de datos
    let imagesRef = Database.database().reference().child("images")
    
    // Cantidad de imágenes a recuperar por página
    let pageSize = 10
    
    // Última clave de la página anterior (inicialmente establecida en nil para la primera página)
    var lastKey: String? = nil
    
    // Consultar la base de datos para la próxima página de imágenes
    imagesRef.queryOrderedByKey()
             .queryEnding(atValue: lastKey) // Excluye las imágenes ya recuperadas
             .queryLimited(toLast: UInt(pageSize)) // Limita los resultados al tamaño de página
             .observeSingleEvent(of: .value) { snapshot in
                 // Los resultados se ordenan por claves ascendentes
                 for child in snapshot.children {
                     // Manejar cada imagen aquí
                     let key = child.key
                     let value = child.value
                     // ...
                 }
                 // Establecer la última clave para la próxima página
                 lastKey = snapshot.children.allObjects.first?.key
             }
    

    En este ejemplo, primero definimos una referencia al nodo “images” en la base de datos. También especificamos la cantidad de imágenes a recuperar por página mediante la variable pageSize.

    Luego, definimos una variable lastKey que realiza un seguimiento de la clave de la última imagen recuperada en la página anterior. Inicialmente, se establece en nil ya que no hay una página anterior para la primera consulta.

    El método queryOrderedByKey() ordena los resultados por claves ascendentes, y el método queryEnding(atValue:) excluye las imágenes que ya se habían recuperado en consultas anteriores especificando lastKey.

    Finalmente, limitamos los resultados al pageSize usando el método queryLimited(toLast:). El método observeSingleEvent(of:) se utiliza para recuperar los datos una vez, en lugar de observar continuamente los cambios.

    En la devolución de llamada, iteramos sobre el snapshot devuelto y manejamos cada imagen según sea necesario. Después de procesar los resultados, actualizamos la variable lastKey con la clave de la última imagen en la página actual, para su uso en la próxima consulta.

    Al usar este enfoque, no se necesita un nodo hijo adicional de id en la base de datos. Las imágenes se ordenan por sus claves, y la paginación se logra ajustando el parámetro lastKey con cada consulta.

Comments are closed.