在过去的几周里,我一直在研究并尝试修复错误。那里有大量建议,我至少尝试了六次,每次都得到相同的结果。
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())
之类的内容时,我看到的键和值都很好。我在这里做什么错了?
编辑2:
如果我们使用Log.d("Titles", it.toString())
,则会得到以下信息:
D/Titles: DataSnapshot { key = subTitle, value = Start Here. }
D/Titles: DataSnapshot { key = title, value = Facing unexpected problems? }
答案 0 :(得分:1)
如果您具有以下数据库:
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)
}