Не удается преобразовать объект типа java.lang.Строку в тип com.reazon.foodrunner.model.Избранное

#android #firebase #android-studio #kotlin #firebase-realtime-database

#Android #firebase #android-studio #kotlin #firebase-база данных в реальном времени.

Вопрос:

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

Избранное:
-UID:
—идентификатор: restaurant_id
—имя: «name»
—рейтинг: rating
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)
  

Ответ №1:

Поскольку у вас есть следующая база данных:

 Favorites
   Uid
     id   : id
     name : name
  

Поэтому вы должны использовать следующий код:

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

Удалите цикл for, потому что при повторении вы получите данные в виде строки вместо вашего пользовательского объекта.

Комментарии:

1. да, это почти не сработало, и в конце я понял, что мне также пришлось изменить типы данных класса модели, которые извлекаются