Это мой класс Java:
public class OnlineMatch{ private FacebookUser firstplayer; private FacebookUser secondplayer; public OnlineMatch(){ } public OnlineMatch(FacebookUser firstplayer, FacebookUser secondplayer) { this.firstplayer = firstplayer; this.secondplayer = secondplayer; } public FacebookUser getFirstplayer() { return firstplayer; } public void setFirstplayer(FacebookUser firstplayer) { this.firstplayer = firstplayer; } public FacebookUser getSecondplayer() { return secondplayer; } public void setSecondplayer(FacebookUser secondplayer) { this.secondplayer = secondplayer; }
}
Я могу правильно создавать объекты и загружать их в Firebase. Структура db следующая:
Затем я пытаюсь напечатать значения моих объектов OnlineMatch (код Котлина):
val match = dataSnapshot.child("multiplayer").getValue(OnlineMatch::class.java) if(match!=null){ System.out.println(match) }
Здесь я получаю этот вывод на консоли Android Studio:
9548-19548 / app.simone W / ClassMapper: нет сеттера / поля для -KqV44f4FUxV8ZDuqL4Y, найденного в классе app.simone.multiplayer.model.OnlineMatch
08-01 19: 14: 38.816 19548-19548 / app.simone W / ClassMapper: нет сеттера / поля для -KqV3sAPXPcYrtr61cDy, найденного в классе app.simone.multiplayer.model.OnlineMatch
08-01 19: 14: 38.816 19548-19548 / app.simone W / ClassMapper: нет сеттера / поля для -KqV2BGH7Z-Y9RxnPGpt, найденного в классе app.simone.multiplayer.model.OnlineMatch
Ваш код запрашивает все в multiplayer
, которое включает в себя все объекты OnlineMatch, которые вы там ранее нажали. Из сообщения об ошибке вы можете увидеть, что он пытается найти сеттер или поле для push-ID -KqV44f4FUxV8ZDuqL4Y
которое он нашел только в multiplayer
Если вы хотите получить один объект OnlineMatch, вам придется копать объекты в идентификаторы push под multiplayer
. Поэтому это должно дать вам что-то:
dataSnapshot.child("multiplayer/-KqV44f4FUxV8ZDuqL4Y").getValue(OnlineMatch::class.java)
В любом случае вам понадобится идентификатор push по вашему выбору или откройте их у детей моментального снимка и создайте новый снимок этого ребенка.
Дуг Стивенсон, ваш ответ был полезен для меня. Я создал массив строк, где я сохраняю ключ, а затем перебираю дочерний элемент для каждого конкретного ключа:
override fun onDataChange(dataSnapshot: DataSnapshot) { // Get Post object and use the values to update the UI val match = dataSnapshot.children var keysArray = KeysHandler() if(match!=null){ // saving keys into an array for (data in match){ keysArray.addToList(data.key) } // saving an OnlineMatch object into another array repeat(keysArray.list.size){ i-> val onlineMatch = dataSnapshot.child(keysArray.getElement(i)).getValue(OnlineMatch::class.java)!! requestsUsers.add(onlineMatch) } // updating GUI updateRequests() } }