无法将 java.lang.String 类型的对象转换为 com.reazon.foodrunner.model.Favorite 类型



大多数情况下,确切的代码在另一种类型的代码结构中都能很好地工作,但在这里却不起作用,尽管DB的结构与它应该的结构完全一致

收藏夹:
+-UID:
+--id:restaurant_id
+---name:"name">
+--评级:评级
+image_url:"image_url">

Favrouite片段代码:

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)

由于您有以下数据库:

Favorites
Uid
id   : id
name : name

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

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

删除for循环,因为当您迭代时,您将获得字符串形式的数据,而不是自定义对象。

相关内容

最新更新