从昨天开始,我就遇到了这个错误。我实现了一个聊天应用,Kotlin,运行代码时遇到问题。我收到了Firebase DatabaseException:
无法将类型为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)
答案 0 :(得分:0)
您遇到以下错误:
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"
看到uid
节点下还有一个额外的users
节点吗?为了拥有这样的架构,在将User对象添加到数据库时,请使用以下代码行:
val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val uidRef = rootRef.child("users").child(uid)
uidRef.setValue(yourUserObject)
然后您的实际代码可以正常工作。