com.google.firebase.database.DatabaseException: 无法将类型 java.lang.String 的对象转换为类型 com.example.events.Model.IMG

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.events.Model.IMG

这是我的 activity 代码:-

class event_images : AppCompatActivity() {

    private var recyclerView: RecyclerView? = null
    private var imageAdapter: Imageadapter? = null
    private var img1: MutableList<IMG>? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_event_images)

        recyclerView = event_images
        recyclerView?.setHasFixedSize(true)
        recyclerView?.layoutManager = LinearLayoutManager(baseContext)

        img1 = ArrayList()
        imageAdapter = baseContext?.let { Imageadapter(it, img1 as ArrayList<IMG>, true) }
        recyclerView?.adapter = imageAdapter

        val wimagesRef = FirebaseDatabase.getInstance().getReference().child("events")
        e_imagesRef.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                for (snapshot in dataSnapshot.children){
                    val image = snapshot.getValue(IMG::class.java)
                    if (image != null){
                        event_images.visibility = View.VISIBLE
                        (img1 as ArrayList<IMG>)?.add(image)
                    }
                }
            }

            override fun onCancelled(error: DatabaseError) {

            }
        })


    }
}

这里是适配器代码:-

class Imageadapter (private var mContext: Context,
                    private var mimages: List<IMG>,
                    private var isActivity: Boolean = false) : RecyclerView.Adapter<Imageadapter.ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Imageadapter.ViewHolder {
        val view = LayoutInflater.from(mContext).inflate(R.layout.images_adapter, parent, false)
        return Imageadapter.ViewHolder(view)
    }

    override fun onBindViewHolder(holder: Imageadapter.ViewHolder, position: Int) {
        val imageid = mimages[position]

        Picasso.get().load(imageid.getImageUrl()).into(holder.ImageIv)
        holder.Datetv.text = imageid.getDate()
        holder.Venuetv.text = imageid.getVenue()

    }


    override fun getItemCount(): Int {
        return mimages.size
    }

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        var ImageIv: ImageView = itemView.image_ret
        var Datetv: TextView = itemView.date_ret
        var Venuetv: TextView = itemView.venue_ret

    }

这是我的模型代码:-

class IMG {
    private var ImageUrl: ImageView = ""
    private var date: String = ""
    private var venue: String = ""

    constructor()

    constructor(ImageUrl: ImageView,
                date: String,
                venue: String){
        this.ImageUrl = ImageUrl
        this.date= date
        this.venue = venue
    }



    fun getDate(): String
    {
        return date
    }

    fun setDate(Date: String){
        this.date = Date
    }

    fun getImageUrl(): String {
        return ImageUrl
    }
    fun setImageUrl(ImageUrl: String){
        this.ImageUrl = ImageUrl
    }

    fun getVenue(): String
    {
        return venue
    }
    fun setVenue(Venue: String){
        this.venue = Venue
    }
}

我的项目错误是:-

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.events.Model.IMG at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80) at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203) at com.example.events.event_images$onCreate.onDataChange(event_images.kt:38) at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) at com.google.firebase.database.core.view.EventRaiser.run(EventRaiser.java:55) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

数据库的快照是:-

我不知道如何解决这个错误。 有人可以帮我解决这个问题吗?

这意味着数据库遇到了一个字符串 属性,您的代码表示它应该在您的 snapshot.getValue(IMG::class.java) 调用中期待一个完整的 IMG 对象。

我们无法确定这是为什么,但请检查您数据库中的 events 节点,因为它下面至少有一个子节点 node/property 是一个字符串值,而不是一个IMG 对象。


添加数据库截图后更新:

您的 events 节点包含单个事件的属性。所以当你循环 dataSnapshot.children 时,snapshot 变量将首先指向 date 属性,然后指向 imageurl 属性,然后指向venue 属性。 None 这些属性本身是一个有效的 IMG 对象,这就是 SDK 抛出异常的原因。

最好的解决方案是将您的数据库更改为have/allow events 节点下的多个事件:

events: {
  "-Mfdskheuheas...": {
    date: "...",
    imageurl: "..."
    venue: "..."
  },
  "-Mzsdfhkerqas...": {
    date: "...",
    imageurl: "..."
    venue: "..."
  },
}

您通常会在代码中调用 push() 以在数据库中生成额外的级别,这会生成上述 -M... 类型的键。另请参阅 adding items to a list.

上的文档

如果您真的只想在 /events 下拥有单个事件的属性,您可以从 onDataChange:

中删除循环
override fun onDataChange(dataSnapshot: DataSnapshot) {
    val image = dataSnapshot.getValue(IMG::class.java)
    if (image != null){
        event_images.visibility = View.VISIBLE
        (img1 as ArrayList<IMG>)?.add(image)
    }
}

如果问题没有解决,您可能需要更改。那么请分享您的数据库快照。

class IMG {
    private var ImageUrl: ImageView = ""

constructor(ImageUrl: ImageView,
                date: String,
                venue: String){
        this.ImageUrl = ImageUrl
        this.date= date
        this.venue = venue
    }

class IMG {
    private var ImageUrl: String = ""

constructor(ImageUrl: String,
            date: String,
            venue: String){
    this.ImageUrl = ImageUrl
    this.date= date
    this.venue = venue
}