android - com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为com.example.noalumni.model.Users类型

标签 android firebase kotlin firebase-realtime-database

自昨天以来,我一直处于这个错误的面前。我实现了一个聊天应用,Kotlin,运行代码时遇到问题。我收到了Firebase DatabaseException:

Can't convert object of type java.lang.String to type com.example.noalumni.model.Users



没人知道如何解决吗?这是我的代码。

NewMessageActivity.kt

package com.example.noalumni.activities

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.noalumni.R
import com.example.noalumni.fragments.ChatFragment
import com.example.noalumni.model.Users
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import com.google.firebase.firestore.auth.User
import com.squareup.picasso.Picasso
import com.xwray.groupie.GroupAdapter
import com.xwray.groupie.GroupieViewHolder
import com.xwray.groupie.Item
import kotlinx.android.synthetic.main.activity_new_message.*
import kotlinx.android.synthetic.main.user_row_new_message.view.*

class NewMessageActivity : AppCompatActivity() {


    companion object {
        val USER_KEY = "USER_KEY"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_new_message)
        supportActionBar?.title = "Selectionner un contact"

        fetchUsers()
    }

    private fun fetchUsers() {
        val ref = FirebaseDatabase.getInstance().getReference("/users")
        ref.addListenerForSingleValueEvent(object : ValueEventListener {

            override fun onDataChange(p0: DataSnapshot) {
                val adapter = GroupAdapter<GroupieViewHolder>()
                p0.children.forEach {
                    Log.d("NewMessage", it.toString())
                    val user : Users = it.getValue(Users::class.java) as Users
                    adapter.add(UserItem(user))
                }
                adapter.setOnItemClickListener { item, view ->
                    val userItem = item as UserItem
                    val intent = Intent(view.context, ChatFragment::class.java)
                    //intent.putExtra(USER_KEY, userItem.user.username)
                    intent.putExtra(USER_KEY, userItem.user)
                    startActivity(intent)

                    finish()
                }
                recyclerview_newmessage.adapter = adapter
            }
            override fun onCancelled(p0: DatabaseError) {
            }
        })
    }
}

class UserItem(val user: Users) : Item<GroupieViewHolder>() {
    override fun bind(viewHolder: GroupieViewHolder, position: Int) {
        viewHolder.itemView.username_textview_newmessage.text = user.username
        Picasso.get().load(user.profileImageUrl).into(viewHolder.itemView.imageview_new_message)
    }

    override fun getLayout(): Int {
        return R.layout.user_row_new_message
    }

}

我的资料课
用户数
Users.kt
package com.example.noalumni.model
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Users (val username: String, val email: String, val password: String, val profileImageUrl: String): Parcelable {
    constructor() : this("", "", "", "")
}

logcat输出
2020-06-04 11:09:39.649 5093-5093/com.example.test2 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.test2, PID: 5093
    com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.noalumni.model.Users
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@19.3.0:435)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@19.3.0:231)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@19.3.0:79)
        at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@19.3.0:203)
        at com.example.noalumni.activities.NewMessageActivity$fetchUsers$1.onDataChange(NewMessageActivity.kt:46)
        at com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-database@@19.3.0:179)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.3.0:75)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.3.0:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.3.0:55)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)


enter image description here

最佳答案

您收到以下错误:

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.noalumni.model.Users



因为您试图将users节点内的所有子级都作为User对象,而所有对象实际上都是字符串。为了能够获得User对象,您需要对数据库结构进行一些更改,因此我可以像这样:
Firebase-root
  |
  --- users
        |
        --- uid
             |
             --- email: "badarouyazid98@gmail.com"
             |
             --- password: "azerty"
             |
             --- profileImageUrl: ""
             |
             --- username: "Maria"

看到uid节点下还有一个额外的users节点吗?为了拥有这样的架构,在将User对象添加到数据库时,请使用以下代码行:
val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val uidRef = rootRef.child("users").child(uid)
uidRef.setValue(yourUserObject)

这样您的实际代码就可以正常工作。

关于android - com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为com.example.noalumni.model.Users类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62190988/

相关文章:

java - 如何在Java Android中的Firebase中找到子子项

kotlin - 我想将数据传递给弹出对话框

Kotlin:当枚举名称明确时省略枚举名称

android - 如何用 Flow 替换 LiveData

android - 编程式 SD 卡安装/卸载

android - 如何将 V24 可绘制对象转换为与旧 API 兼容的更低版本

android - 自定义工具栏android

java - 应用数据清除后如何退出Google?

javascript - 如何通过节点js获取交易结果Firebase中的值(value)

list - 将List <Keys>和List <Values>合并到List <Hashmap <Key,Value >>