android - 使用 kotlin 中的类将嵌套数据提取到 Firestore
问题描述
我试图将嵌套数据写入 Firestore。但是这个错误一次又一次地出现。
java.lang.RuntimeException:无法反序列化对象。需要一个列表,但得到了一个类 java.util.HashMap(在“prebooking”字段中找到)
我确信错误的出现是因为早先的时间戳与应用程序运行平稳的时间戳有关。回收站视图已正确填充。
//预约课
data class Prebooking(val drop_details:Timestamp, val pickup_details:Timestamp){}
//我的模型类
data class AvailableVehicleModel(val vehicle_name:String="",val vehicle_number:String="", val vendor_organization:String="", val vehicle_image_url:String="", val weekday_cost:String="", val weekend_cost:String="", val prebooking: List <Prebooking> = emptyList())
//将数据添加到回收站视图的代码
override fun onStart() {
super.onStart()
fragmentView.recycler_view_available_vehicle.layoutManager= LinearLayoutManager(fragmentView.context)
//create the root reference of your Firestore database
val rootRef= FirebaseFirestore.getInstance()
val query=rootRef.collection("available_vehicle") .orderBy("vehicle_name", Query.Direction.ASCENDING)
val options = FirestoreRecyclerOptions.Builder<AvailableVehicleModel>().setQuery(query, AvailableVehicleModel::class.java).build()
availableVehicleFirestoreRecyclerAdapter=AvailableVehicleFirestoreRecyclerAdapter(options)
fragmentView.recycler_view_available_vehicle.adapter=availableVehicleFirestoreRecyclerAdapter
if (availableVehicleFirestoreRecyclerAdapter!= null) {
availableVehicleFirestoreRecyclerAdapter!!.startListening()
}
}
inner class VehicleViewHolder internal constructor(private val view:View): RecyclerView.ViewHolder(view){
internal fun setVehicleInfo(availableVehicleModel: AvailableVehicleModel,itemId:String?){
view.bike_name.text=availableVehicleModel.vehicle_name
view.bike_number.text=availableVehicleModel.vehicle_number
Glide.with(fragmentView).load(availableVehicleModel.vehicle_image_url).into(view.bike_img)
view.bike_vendor_organization.text=availableVehicleModel.vendor_organization
view.cost_weekday.text=availableVehicleModel.weekday_cost
view.cost_weekend.text=availableVehicleModel.weekend_cost
view.setOnClickListener{
val intent=Intent(fragmentView.context, ToRentActivity::class.java)
intent.putExtra("item_id",itemId)
startActivity(intent)
}
}
}
inner class AvailableVehicleFirestoreRecyclerAdapter internal constructor(options:FirestoreRecyclerOptions<AvailableVehicleModel>): FirestoreRecyclerAdapter<AvailableVehicleModel, VehicleViewHolder>(options){
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VehicleViewHolder {
val view=LayoutInflater.from(parent.context).inflate(R.layout.vehicle_detail_card,parent,false)
return VehicleViewHolder(view)
}
override fun getItemViewType(position: Int): Int {
return super.getItemViewType(position)
}
override fun onBindViewHolder(vehicleViewHolder: VehicleViewHolder, position: Int, availableVehicleModel: AvailableVehicleModel) {
vehicleViewHolder.setVehicleInfo(availableVehicleModel,availableVehicleFirestoreRecyclerAdapter?.snapshots?.getSnapshot(position)?.id)
}
override fun onDataChanged() {
fragmentView.recycler_view_available_vehicle.layoutManager?.scrollToPosition(itemCount - 1)
//TODO: Add a refresh sign too
}
}
//
我的数据库视图:
解决方案
您收到以下错误:
java.lang.RuntimeException:无法反序列化对象。需要一个列表,但得到了一个类 java.util.HashMap(在“prebooking”字段中找到)
因为您的类中的prebooking
属性AvailableVehicleModel
被声明为 typeList
而在数据库中是 type Map
。如果该prebooking
属性是Array
数据库中的类型,则根本不会有问题,因为即使该prebooking
属性是一个数组,在获取时,它也会返回 an ArrayList
,而不是an array
。
为了解决这个问题,在尝试获取您的prebooking
财产的价值时,将其作为 aMap
而不是作为 a获取List
。或者,将prebooking
数据库中的属性类型更改为 typearray
而不是object
。
推荐阅读
- javascript - EmberJS:在 index.html 中设置环境变量
- python - Pandas:如何在 lambda 公式中使用 (df.groupby)
- python - 拟合子类 scipy 分布时的 ValueError
- c++ - 更改 std::array 中元素的顺序会使 AVX 代码失败
- knex.js - 多个唯一约束上的 Knex.js 死锁
- email - 检查 Postfix 发送的电子邮件的状态
- react-native - 导航到嵌套路由,向堆栈添加更多路由
- javascript - 点击这个反应 emoji DIScord.js 时是否可以删除消息
- c++ - 同时写入内存中的一个字节
- c++ - 升级到 1.72.0 后 Boost 构建失败 - 两次相同的目标