【问题标题】:Kotlin - How to save data from firebase to livedata with data class?Kotlin - 如何使用数据类将数据从 firebase 保存到 livedata?
【发布时间】:2021-08-27 20:23:56
【问题描述】:

我尝试运行此代码,但出现错误:无法转换 java.lang.String 类型的对象 我需要从实时数据库中获取数据并将其保存到 livedata。

fun loadRecentlyAddedVoices(){
    REF_DATABASE_ROOT.child(NODE_STICKERS).addListenerForSingleValueEvent(object :
        ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {

            for (ds in snapshot.children) {
                recentlyAddedVoices.value = ds.getValue(VoicesModel::class.java).toString()
            }
        }

        override fun onCancelled(error: DatabaseError) {

        }

    })
}

声音模型:

data class VoicesModel(
       val title:String,
       val description: String,
       val count: Int,
       val likes: Int,
       val downloads: Int,
       val data: VoiceDataModel
)

语音数据模型:

data class VoiceDataModel(
       val voice_title: String,
       val source: String
)

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database android-livedata


    【解决方案1】:

    无法转换 java.lang.String 类型的对象

    根据您的共享代码,此异常很可能来自以下:

    recentlyAddedVoices.value = ds.getValue(VoicesModel::class.java).toString()
    

    recentlyAddedVoices 看起来像VoiceDataModel 列表的MutableLiveData 对象。

    在这里使用toString() 是引发异常的原因。并且没有理由将此值转换为字符串。

    相反,您需要首先通过迭代数据快照的子项来创建VoicesModel 的普通列表,然后在列表完成后设置LiveData

    fun loadRecentlyAddedVoices(){
        REF_DATABASE_ROOT.child(NODE_STICKERS).addListenerForSingleValueEvent(object :
            ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
    
                val temp: MutableList<VoicesModel> = mutableListOf()
    
                for (ds in snapshot.children) {
                     val value: voiceModel = ds.getValue<VoicesModel>(VoicesModel::class.java)
                     // Aggregating to a non-live data list
                     temp.add(value)
                }
    
                // Setting the Live data value:
                recentlyAddedVoices.value = temp
            }
    
            override fun onCancelled(error: DatabaseError) {
    
            }
    
        })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多