android - 无法将 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)
解决方案
由于您有以下数据库:
Favorites
Uid
id : id
name : name
因此,您必须使用以下代码:
override fun onDataChange(p0: DataSnapshot) {
val favorite = p0.getValue(Favourite::class.java)
删除 for 循环,因为当您迭代时,您将获取数据作为 String 而不是您的自定义对象。
推荐阅读
- r - cowplot plot_grid 自动缩小绘图的大小
- dart - l10n 在 initState 之前调用
- javascript - 量角器:计算虚拟列表中的所有元素
- java - 在 Spring Webflux 中执行阻塞 JDBC 调用
- aws-lambda - Graphql 返回不能为不可为空的字段 Query.getDate 返回 null。由于我是 graphql 的新手,我想知道我的方法是错误的还是我的代码?
- gremlin - 小鬼最短路径
- mysql - Dart mysql在地图中插入占位符
- android - 如何在 android 中更改 TextInputLayout 中的背景笔触颜色?
- android - 房间线程,RxJava,选择问题
- python-3.x - 有没有办法在张量流中施加约束,我可以在此过程中强制执行一些规则吗?