Извлечение вложенных данных в Firestore с использованием классов в kotlin - PullRequest
0 голосов
/ 12 октября 2018

Я пытался записать вложенные данные в Firestore.Но эта ошибка приходит снова и снова.

java.lang.RuntimeException: Не удалось десериализовать объект.Ожидается список, но есть класс java.util.HashMap (находится в поле 'prebooking')

Я уверен, что ошибка возникает из-за того, что как-то связано с отметкой времени, как раньше безвременная метка приложение работало гладко.Вид переработчика был заполнен правильно.

// Prebooking Class

data class Prebooking(val drop_details:Timestamp, val pickup_details:Timestamp){}

// Моя модель Class

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
    }

}

//

Моя база данных:

enter image description here

1 Ответ

0 голосов
/ 12 октября 2018

Вы получаете следующую ошибку:

java.lang.RuntimeException: Невозможно десериализовать объект.Ожидается список, но есть класс java.util.HashMap (находится в поле 'prebooking')

, поскольку ваше свойство prebooking в вашем классе AvailableVehicleModel объявлено типа List, ав базе данных имеет тип Map.Если бы свойство prebooking в вашей базе данных имело бы тип Array, проблем вообще не было бы, потому что даже если свойство prebooking является массивом, при получении он возвращает ArrayList, не и array.

Чтобы решить эту проблему, при попытке получить значение вашего свойства prebooking получите его как Map, а не как List.Или измените тип вашего свойства prebooking в вашей базе данных на тип array, а не object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...