通过简单的Firebase调用填充数据类

时间:2019-07-04 08:20:24

标签: android firebase firebase-realtime-database kotlin

在过去的几周里,我一直在研究并尝试修复错误。那里有大量建议,我至少尝试了六次,每次都得到相同的结果。

Kotlin如何访问Firebase数据并填充一个非常简单的数据类?

  

错误:com.google.firebase.database.DatabaseException:       无法将类型为java.lang.String的对象转换为com.touchtapapp.handsofhope.LandingTextTitles

阅读有关先转换为Map然后转换为我的自定义数据类的建议...尝试此操作,成功创建带有正确数据的Mapped值...,但是在将Mapped值发送到时遇到了完全相同的错误海关数据类(LandingTextTitles)。

当前代码:

数据模型类

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

从Firebase检索数据的方法

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 data snapshot

编辑2:

如果我们使用Log.d("Titles", it.toString()),则会得到以下信息:

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

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

1 个答案:

答案 0 :(得分:1)

如果您具有以下数据库:

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

然后,您可以通过执行以下操作来检索titlesubTitle

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)
            }