¿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):
- ¿Cómo simplificar múltiples controles de igual a igual en las condiciones?
- La instancia de fragment se conserva pero el fragment hijo no se vuelve a adjuntar
- Adaptación con los rasgos de Kotlin que incluyen methods implementados
- Kotlin: ¿por qué necesito inicializar una var con getter personalizado?
- Método de invocación de objects burlados (Mockito + Kotlin)
fun createMatch(match: OnlineMatch) { val matchList = database.child("multiplayer").push() matchList.setValue(match) }
Por lo tanto, mi estructura de database es la siguiente:
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.
- Kotlin + Intelij + HtmlUnit: no se puede invocar ninguna de las siguientes funciones con los arguments suministrados
- Obtenga el recurso de identificación de Android de una cadena
- Android: el calendar especial de Java / Kotlin aparece
- El complemento Anko no se puede ejecutar en la versión de Androidstudio> 2.1
- ¿Cómo get una class de param genérica en Kotlin?
- ¿Cómo puedo convertir una parte del file fuente de Java a Kotlin?
- Kotlin: Al ejecutar Hello Program obteniendo ClassNotFoundException
- Cómo implementar el repository de interfaz en otro module de proyecto en AndroidStudio usando Dagger2 y Kotlin
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.