首页 > 解决方案 > 无法将 java.lang.String 类型的对象转换为 com.reazon.foodrunner.model.Favourite 类型

问题描述

大多数情况下,确切的代码在另一种类型的代码结构中工作正常,但在这里不起作用,尽管 DB 的结构完全对齐,就像它应该是

Favourites:
+-UID:
+---id: restaurant_id
+---name: "名称"
+---评级:评级
+image_url:"image_url"

FavrouiteFragment 代码:

package com.reazon.foodrunner.fragment

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.*
import com.reazon.foodrunner.R
import com.reazon.foodrunner.adapter.FavouriteRecyclerAdapter
import com.reazon.foodrunner.model.Favourite

class FavouriteFragment : Fragment() {

    private var recyclerAdapter: FavouriteRecyclerAdapter? = null
    private var recyclerFavourite: RecyclerView? = null
    internal var favouritesList: MutableList<Favourite> = ArrayList()
    private var layoutManager: RecyclerView.LayoutManager? = null

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_favourite, container, false)

        recyclerFavourite = view.findViewById(R.id.recyclerFavouriteAll)
        layoutManager = LinearLayoutManager(activity)
        recyclerFavourite!!.layoutManager = layoutManager
        retrieveAllFavouriteRestaurants()

        return view
    }

    private fun retrieveAllFavouriteRestaurants() {
        favouritesList.clear()
        val firebaseUser = FirebaseAuth.getInstance().currentUser!!.uid
        val mDatabaseReference = FirebaseDatabase.getInstance().reference.child("Favourites/$firebaseUser")//.child()
        mDatabaseReference.addValueEventListener(object : ValueEventListener {
            override fun onCancelled(error: DatabaseError) {
                Log.d("ERROR ", "" + error.message)
            }

            override fun onDataChange(p0: DataSnapshot) {
                for (snapshot in p0.children) {
                    val favorite = snapshot.getValue(Favourite::class.java)

                    recyclerAdapter = FavouriteRecyclerAdapter(context!! , favouritesList)
                    recyclerFavourite?.adapter = recyclerAdapter

                    if (favorite != null) {
                        favouritesList.add(favorite)
                    }

                }

            }
        })

    }

}

型号类:

package com.reazon.foodrunner.model

data class Favourite (
    var id:Int? = null,
    var name:String? = null,
    var rating:Double? = null,
    var cost_for_one:Int? = null,
    var image_url:String? = null
)

LogCat 窗口错误识别:

2020-09-05 09:22:07.520 5208-5208/com.reazon.foodrunner E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.reazon.foodrunner, PID: 5208
    com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.reazon.foodrunner.model.Favourite
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:435)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:231)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:79)
        at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
        at com.reazon.foodrunner.fragment.FavouriteFragment$retrieveAllFavouriteRestaurants$1.onDataChange(FavouriteFragment.kt:50)
        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$1.run(EventRaiser.java:55)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

标签: androidfirebaseandroid-studiokotlinfirebase-realtime-database

解决方案


由于您有以下数据库:

Favorites
   Uid
     id   : id
     name : name

因此,您必须使用以下代码:

override fun onDataChange(p0: DataSnapshot) {
     val favorite = p0.getValue(Favourite::class.java)

删除 for 循环,因为当您迭代时,您将获取数据作为 String 而不是您的自定义对象。


推荐阅读