#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. да, это почти не сработало, и в конце я понял, что мне также пришлось изменить типы данных класса модели, которые извлекаются