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) 
  • Каков рекомендуемый способ десериализации документа Firestore, содержащего массив?
  • Firebase возвращает экземпляр null в классе Helper
  • База данных базы данных Firebase запрашивает пользователей в цикле
  • RxJava: как вернуть правильный тип null
  • Удалить слушателя Firebase не работает
  • База данных Firebase Realtime, как узнать состояние «синхронизации»?
  • извлечение данных из firebase
  • где поместите этот код в kotlin / firebasedatabase.getinstance (). setpersistenceenabled (true);
  • Отображение Firebase в Kotlin-Object не работает
  • Firebase: чистый способ использования полей enum в Kotlin / Java?
  • Как я могу прочитать уникальный ключ, предоставленный firebase?
  • Interesting Posts

    Тип несоответствия: предполагаемый тип T, но kotlin.Any ожидалось

    Создать новый объект узла узла из котлина

    Компиляция не выполняется с помощью Gradle и Kotlin

    Как издеваться над реактивным репозиторием, который возвращает Observable

    Компилятор Kotlin всегда сохраняет имена параметров в байт-коде?

    Поделитесь модулем Kotlin с проектом Android и Desktop

    Android Kotlin: Ошибка Неразрешенная ссылка: DaggerAppComponent

    Где поставить сгенерированный источник java или kotlin при создании плагина gradle?

    Котлин инициализирует переменную перед ее объявлением?

    Kotlin: Можем ли мы использовать @Subscribe EventBus (GreenRobot) в Котлине?

    java.lang.NoClassDefFoundError: com.example.api.retrofit.AuthenticationInterceptor $ перехват $ 1

    Swift – выход из внешней функции из закрытия

    Комната Android: каждая переменная связывания в запросе должна иметь соответствующий метод

    Асинхронная анонимная функция в Котлине? (лямбда-выражения)

    Объединение обязательных и произвольных необязательных аргументов конструктора с Groovy

    Давайте будем гением компьютера.