Firebase y recuperación de elementos

Intento leer x cantidad de elementos de Firebase, pero tengo la sensación de que estoy malinterpretando algo …

DataSnapshot devuelve el conteo de niños correcto, sin embargo, cuando bash recorrer los niños, el ciclo nunca se ejecuta.

Nota: Código en Kotlin

fun list(count: Int, callback: ListCallback) { val playersRef = firebase.child("players") val queryRef = playersRef.orderByChild("rank").limitToFirst(count) queryRef.addListenerForSingleValueEvent(object : ValueEventListener { override fun onCancelled(error: FirebaseError?) { Log.e("firebase", error!!.message) } override fun onDataChange(snapshot: DataSnapshot?) { val children = snapshot!!.children // This returns the correct child count... Log.i("firebase", children.count().toString()) val list = ArrayList<Entry>() // However, this loop never executes children.forEach { val e = Entry() e.name = it.child("name").value as String e.rank = it.child("rank").value as Long e.wins = it.child("wins").value as Long e.losses = it.child("losses").value as Long Log.i("firebase", e.toString()) list.add(e) } callback.onList(list) } }) } 

Esto funciona para mí:

 val firebase: Firebase = Firebase("https://stackoverflow.firebaseio.com/34378547") fun main(args: Array<String>) { list(3) Thread.sleep(5000) } fun list(count: Int) { val playersRef = firebase.child("players") val queryRef = playersRef.orderByChild("rank").limitToFirst(count) queryRef.addListenerForSingleValueEvent(object : ValueEventListener { override fun onCancelled(error: FirebaseError?) { println(error!!.message) } override fun onDataChange(snapshot: DataSnapshot?) { val children = snapshot!!.children // This returns the correct child count... println("count: "+snapshot.children.count().toString()) children.forEach { println(it.toString()) } } }) } 

Salida:

 count: 2 DataSnapshot { key = -K6-Zs5P1FJLk4zSgNZn, value = {wins=13, name=fluxi, rank=1, losses=1} } DataSnapshot { key = -K6-ZtdotHkkBzs5on9X, value = {wins=10, name=puf, rank=2, losses=42} } 

Actualizar

En los comentarios hubo alguna discusión sobre por qué snapshot.children.count() funciona, mientras que children.count() no. El problema es causado por dos hechos:

  1. DataSnapshot.getChildren() Firebase devuelve un Iterable , que solo se puede iterar hacia adelante (como el contrato de un Iterable ).
  2. El count() Kotlin count() pasa por encima de Iterable para contar sus elementos.

Entonces, una vez hecho el count() de Kotlin count() , el Iterable está al final de la secuencia. El siguiente bucle for ya no tiene nada que recorrer. En mi fragment, llamo snapshot.children separado para get un iterador por separado para get el conteo.

Sabiendo cómo Kotlin implementa count() , es mejor usar el childCount incorporado de Firebase:

 println("count: "+snapshot.childrenCount)