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. Firebase DataSnapshot.getChildren() возвращает Iterable , который может быть только итератирован только вперед (как и контракт Iterable ).
  2. count() Kotlin count() пересекает Iterable чтобы подсчитать его элементы.

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

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

 println("count: "+snapshot.childrenCount) 
Intereting Posts
Kotlin Anko Custom View Родительский охват Kotlin с картой в Android Kotlin смешивается с ошибкой Java: не удается найти символ Как правильно реализовать интерфейс в фрагменте андроида? Есть ли способ перебрать все поля класса данных без использования отражения? как реализовать Switch, используя привязку данных в android Перехватчик Kotlintest и латинитовые вары Тест в Котлине не может получить доступ к защищенному методу Тип несоответствия: выведенный тип – String? но String ожидалось в kotlin Почему Smartcast не работает после nullcheck Ошибка «Расширение с именем» android «не существует» при добавлении проекта Kotlin в Android Внедрение интерфейса анонимно в Kotlin приводит к ошибке «не имеет конструкторов» Сбой загрузки с помощью NetWare клиента AsyncRestTemplate В тестовом пакете не читаются классы Котлина, определенные в основном пакете Коммуникация Kotlin приближается из-за нулей при использовании