Получить HashMap из Firebase, используя Kotlin - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь получить список объектов "Game" из моей базы данных Firebase, используя Kotlin в Android Studio.

my firebase database

Я использую код ниже:

private fun getGamesAvailable() {
    var ref = FirebaseDatabase.getInstance().getReference("games")
    var gamesMutableList: MutableList<Game> = mutableListOf()
    val menuListener = object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            for (dataValues in dataSnapshot.children) {
                val game: Game? = dataValues.getValue(Game::class.java)
                gamesMutableList.add(game!!)
            }
            val adapter = GameAdapter(applicationContext, R.layout.games_list, gamesMutableList)
            listViewGames.adapter = adapter
        }
        override fun onCancelled(databaseError: DatabaseError) {
            // handle error
        }
    }
    ref.addListenerForSingleValueEvent(menuListener)
}

, но я получаю ошибку

com.google.firebase .database.DatabaseException: ожидал список при десериализации, но получил класс java .util.HashMap

Я понимаю, что проблема в том, что я пытаюсь получить список игр, у которых есть список игроков, но я не знаю, как это решить. Я нашел несколько сообщений об этом в stackoverflow, но я не совсем понимаю ответы и то, как они решают эту проблему.

Android - ожидал список при десериализации, но получил класс java .util.HashMap

Ожидается список при десериализации, но есть класс java .util.HashMap

Если кто-нибудь может помочь мне понять меня буду очень благодарен!

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Трудно быть уверенным, не видя Game. Но я думаю, что вы смоделировали mplayers как List<Player> или Player[]. Где Player будет классом, который моделирует данные для каждого игрока в mplayers.

Firebase имеет очень строгое определение того, как выглядит массив / список, а имена игроков как ключи не соответствуют это определение.

То, что вы показываете для mplayers в JSON, будет преобразовано в Map<String, Player> в вашем коде.

0 голосов
/ 13 февраля 2020

я надеюсь, что вы не решили эту проблему к тому моменту, когда я отправил свой "ответ", wink wink .

Я предполагаю, что вы получаете сообщение об ошибке line

val game: Game? = dataValues.getValue(Game::class.java)

В этом случае мне всегда помогает установка точки останова, в которой я получаю данные из службы и использую выражение оценки (Alt + F8), чтобы увидеть скрытую ясность, которую возвращает объект, и лучше понять, что находится внутри коробки.

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

Я еще не использовал DataSnapshots, но

Позвольте привести пример с DocumentSnapshot

Evaluate Expression

Затем вы можете искать то, что у меня внутри, и анализировать данные один за другим или другими способами, которые вы можете сейчас.

fields

Это обычно помогает мне, когда я не играю nd простой ответ онлайн или у меня нет необходимых моделей для анализа данных.

Я надеюсь, что помог Гийому, хорошего дня и правильного решения вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...