Firebase & Retrieving Elements

Я пытаюсь прочитать x количество элементов из Firebase, но у меня есть чувство, что я что-то недопонимаю …

DataSnapshot возвращает правильный подсчет числа, однако, когда я пытаюсь выполнить петлю через дочерние элементы, цикл никогда не выполняется.

Примечание: Код в Котлине

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) } }) } 

Это работает для меня:

 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()) } } }) } 

Вывод:

 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} } 

Обновить

В комментариях было некоторое обсуждение о том, почему работает snapshot.children.count() , а children.count() – нет. Проблема вызвана двумя фактами:

  1. В DataSnapshot.getChildren() Firebase возвращается Iterable , который может быть повторен только вперед (как и контракт Iterable ).
  2. count() Kotlin count() пересекает Iterable для подсчета его элементов.

Поэтому после того, как count() Котлина count() сделан, Iterable находится в конце последовательности. В последующем for цикла больше нечего контактировать. В моем фрагменте я вызываю snapshot.children отдельно, чтобы получить отдельный итератор, чтобы получить счет.

Зная, как Kotlin реализует count() лучше использовать встроенные childrenCount FirebaseCount:

 println("count: "+snapshot.childrenCount) 
Intereting Posts