¿Cómo recuperar datos de una database de Firebase con Kotlin?

Este es el model que cargué en Firebase:

public class OnlineMatch{ private User user1; private User user2; public OnlineMatch(User firstPlayer, User secondPlayer) { this.user1 = firstPlayer; this.user2 = secondPlayer; } } 

Luego envío datos a Firebase de esta manera (kotlin):

  fun createMatch(match: OnlineMatch) { val matchList = database.child("multiplayer").push() matchList.setValue(match) } 

Por lo tanto, mi estructura de database es la siguiente:

enter image description here Si amplío un nodo, puedo ver perfectamente mis objects: OnlineMatch (User1, User2)

Ahora me gustaría consultar el file db y get una ArrayList '<' OnlineMatch '>'. Ya encontré los documentos de Firebase pero no encontré nada útil. ¿Como lo puedo hacer? Gracias por adelantado.

No encontraste algo útil porque cuando consultas contra una database de Firebase obtienes un Map y no una ArrayList . Todo en Firebase está estructurado como pares de key y valor. Usar una ArrayList es un antipatrón cuando se trata de Firebase. Una de las muchas razones por las que Firebase recomienda no usar arreglos es que hace que las reglas de security sean imposibles de escribir.

En Kotlin no hay necesidad de getters y setters. Es cierto que detrás de las escenas esas funciones existen, pero no hay necesidad de definirlas explícitamente. Para establecer esos campos, puede usar el siguiente código:

 val onlineMatch = OnlineMatch() //Creating an obect of OnlineMatch class onlineMatch.user1 = userObject //Setting the userObject to the user1 field of OnlineMatch class //onlineMatch.setUser(userObject) 

Como probablemente vea, he comentado la última línea porque no es necesario usar un setter para establecer un userObject .

Y muy importante, no olvides agregar the no argument constructor en tu class de OnlineMatch que se necesita para Firebase.

 public OnlineMatch() {} 

Editar:

Para get realmente los datos, simplemente coloque un oyente en el nodo deseado y obtenga los datos del object dataSnapshot en un HashMap.

 val map = HashMap<String, OnlineMatch>() 

Luego simplemente itere sobre HashMap siguiente manera:

 for ((userId, userObject) in map) { //do what you want with them } 

O simplemente use el siguiente código:

 val rootRef = firebase.child("multiplayer") rootRef.addListenerForSingleValueEvent(object : ValueEventListener { override fun onCancelled(error: FirebaseError?) { println(error!!.message) } override fun onDataChange(snapshot: DataSnapshot?) { val children = snapshot!!.children children.forEach { println(it.toString()) } } }) 

Espero eso ayude.

  • Uso de Kotlin Coroutines en Android
  • Invoque RxJava2 cancelable / desechable del hilo correcto
  • ¿Cómo acceder al object compañero de Kotlin en Java?
  • Prueba Robolectric y LiveData
  • Retrofit - pasa dos parameters
  • No se puede establecer ViewModel en Kotlin
  • La versión de lanzamiento de Gradle falló con Gradle 3.3
  • Kotlin: ¿Funciones de order superior para contar la cantidad de ocurrencias en una list?
  • Conversión de código de Java a Kotlin en Android Studio
  • Cómo livedata envía los datos a la actividad si hay algún cambio
  • ¿Cómo enlazar el evento onClick de la vista usando Android Binding Library y Kotlin?