Заполнение класса данных с помощью простых вызовов Firebase - PullRequest
0 голосов
/ 04 июля 2019

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

Как Kotlin получает доступ к данным Firebase и заполняет очень простой класс данных?

Ошибка: com.google.firebase.database.DatabaseException: Невозможно преобразовать объект типа java.lang.String в тип com.touchtapapp.handsofhope.LandingTextTitles

Ознакомьтесь с предложениями в первую очередьпреобразовать в карту, а затем в мой пользовательский класс данных ... попытался это, успешно создал сопоставленные значения с правильными данными ... но столкнулся с точно такой же ошибкой при отправке сопоставленных значений в класс таможенных данных (LandingTextTitles).

Текущий код:

Класс модели данных

data class LandingTextTitles(
        val subTitle: String,
        val title: String
)

Метод извлечения данных из базы данных

private fun initTitles() {

    val ref = FirebaseDatabase.getInstance().getReference("/landing")
    ref.addListenerForSingleValueEvent(object: ValueEventListener {


        override fun onDataChange(p0: DataSnapshot) {
            p0.children.forEach {
                val titles = it.getValue(LandingTextTitles::class.java)
            }
        }

        override fun onCancelled(p0: DatabaseError) {
            // Handle Cancelled Data            
        }
    })
        // Log the titles value to see if data passed correctly
        Log.d("Titles", titles.toString())

}

Когда я выхожу из системы, например Log.d(it.toString()), я вижу ключи и значения просто отлично.Что я тут не так делаю?

РЕДАКТИРОВАТЬ:
Снимок данных Firebase

РЕДАКТИРОВАТЬ 2:

Если мы используем Log.d("Titles", it.toString()), мы получим следующее:

D/Titles: DataSnapshot { key = subTitle, value = Start Here. }

D/Titles: DataSnapshot { key = title, value = Facing unexpected problems? }

1 Ответ

1 голос
/ 04 июля 2019

Если у вас есть следующая база данных:

landing
   randomId
    subTitle : "Awesome"
    title    : "Developer Team"

Затем вы можете получить title и subTitle, выполнив следующие действия:

private fun initTitles() {

    val ref = FirebaseDatabase.getInstance().getReference("/landing")
    ref.addListenerForSingleValueEvent(object: ValueEventListener {


        override fun onDataChange(p0: DataSnapshot) {
            p0.children.forEach {
                val title    = it.child("title").getValue(String::class.java)
                val subTitle = it.child("subTitle").getValue(String::class.java)

            }
        }

        override fun onCancelled(p0: DatabaseError) {
            // Handle Cancelled Data            
        }
    })
        // Log the titles value to see if data passed correctly
        Log.d("Titles", titles.toString())

}

Если вы хотите использоватькласс данных, затем измените это:

        override fun onDataChange(p0: DataSnapshot) {
            p0.children.forEach {
                val titles = it.getValue(LandingTextTitles::class.java)
            }

на это:

        override fun onDataChange(p0: DataSnapshot) {
                val titles = p0.getValue(LandingTextTitles::class.java)
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...