Как получить данные из базы данных Firebase с помощью Kotlin?

Это модель, которую я загружаю на Firebase:

public class OnlineMatch{ private User user1; private User user2; public OnlineMatch(User firstPlayer, User secondPlayer) { this.user1 = firstPlayer; this.user2 = secondPlayer; } } 

Затем я отправляю данные в Firebase таким образом (kotlin):

  fun createMatch(match: OnlineMatch) { val matchList = database.child("multiplayer").push() matchList.setValue(match) } 

Таким образом, моя структура БД выглядит следующим образом:

введите описание изображения здесь Если я разберу узел, я прекрасно вижу мои объекты: OnlineMatch (User1, User2)

Теперь я хотел бы запросить db и получить ArrayList '<' OnlineMatch '>'. Я уже нашел документы Firebase, но я не нашел ничего полезного. Как я могу сделать? Заранее спасибо.

Вы не нашли ничего полезного, потому что когда вы запрашиваете базу данных Firebase, вы получаете Map а не ArrayList . Все в Firebase структурировано как пары ключей и значений. Использование ArrayList является анти-шаблоном, когда дело доходит до Firebase. Одна из многих причин, по которой Firebase рекомендует использовать массивы, заключается в том, что правила безопасности не могут быть записаны.

В Kotlin нет необходимости в геттерах и сеттерах. Верно, что за кулисами эти функции существуют, но нет необходимости явно определять их. Чтобы установить эти поля, вы можете использовать следующий код:

 val onlineMatch = OnlineMatch() //Creating an obect of OnlineMatch class onlineMatch.user1 = userObject //Setting the userObject to the user1 field of OnlineMatch class //onlineMatch.setUser(userObject) 

Как вы, вероятно, видите, я прокомментировал последнюю строку, потому что нет необходимости использовать сеттер для установки userObject .

И очень важно, не забудьте добавить the no argument constructor в свой класс OnlineMatch который необходим для Firebase.

 public OnlineMatch() {} 

Редактировать:

Чтобы фактически получить данные, просто поместите слушатель на нужный узел и dataSnapshot данные из объекта dataSnapshot в HashMap.

 val map = HashMap<String, OnlineMatch>() 

Затем просто перебирайте HashMap следующим образом:

 for ((userId, userObject) in map) { //do what you want with them } 

Или просто используйте следующий код:

 val rootRef = firebase.child("multiplayer") rootRef.addListenerForSingleValueEvent(object : ValueEventListener { override fun onCancelled(error: FirebaseError?) { println(error!!.message) } override fun onDataChange(snapshot: DataSnapshot?) { val children = snapshot!!.children children.forEach { println(it.toString()) } } }) 

Надеюсь, поможет.