Я пытаюсь прочитать 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()
– нет. Проблема вызвана двумя фактами:
DataSnapshot.getChildren()
Firebase возвращается Iterable
, который может быть повторен только вперед (как и контракт Iterable
). count()
Kotlin count()
пересекает Iterable
для подсчета его элементов. Поэтому после того, как count()
Котлина count()
сделан, Iterable
находится в конце последовательности. В последующем for
цикла больше нечего контактировать. В моем фрагменте я вызываю snapshot.children
отдельно, чтобы получить отдельный итератор, чтобы получить счет.
Зная, как Kotlin реализует count()
лучше использовать встроенные childrenCount
FirebaseCount:
println("count: "+snapshot.childrenCount)