【问题标题】:com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.noalumni.model.Userscom.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.noalumni.model.Users 类型
【发布时间】:2020-09-23 05:20:47
【问题描述】:

从昨天开始我就遇到了这个错误。我用 Kotlin 实现了一个聊天应用程序,但在运行代码时遇到了问题。我遇到了 Firebase 数据库异常:

无法将 java.lang.String 类型的对象转换为 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)

【问题讨论】:

  • 请编辑您的问题并将您的数据库结构添加为屏幕截图。
  • 我刚做了版

标签: android firebase kotlin firebase-realtime-database


【解决方案1】:

您收到以下错误:

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

因为您试图将 users 节点中的所有子节点作为 User 对象,而所有对象实际上都是字符串。为了能够得到User对象,你需要对你的数据库结构做一点改动,所以我可以是这样的:

Firebase-root
  |
  --- users
        |
        --- uid
             |
             --- email: "badarouyazid98@gmail.com"
             |
             --- password: "azerty"
             |
             --- profileImageUrl: ""
             |
             --- username: "Maria"

看到users 节点下有一个额外的uid 节点吗?为了能够拥有这样的架构,当您将 User 对象添加到数据库时,请使用以下代码行:

val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val uidRef = rootRef.child("users").child(uid)
uidRef.setValue(yourUserObject)

那么你的实际代码就可以正常工作了。

【讨论】:

  • 嗨亚兹德!您是否尝试过我上面的解决方案?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我真的很感激。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 2020-08-17
  • 2021-05-02
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多