Не могу преобразовать объект String в класс модели в android kotlin - PullRequest
0 голосов
/ 01 мая 2020

Я пытался извлечь данные из Firebase, используя childeventlistener. Я видел все методы, доступные в stackoverflow для решения проблемы, но ничего не помогало. Код указан ниже

ViewModel


class AccepyReqViewModel : ViewModel() {

    companion object {
        const val TAG = "AcceptViewModel"

    }

    private val _userdetail = MutableLiveData<User>()
    val userdetail: LiveData<User>
        get() = _userdetail

    private val userid = FirebaseAuth.getInstance().currentUser?.uid

    private val chatrequest = "CHATREQ"
    private val db_chat = FirebaseDatabase.getInstance().getReference(chatrequest)

    private val company_info = "User_Info"
    private val db_company = FirebaseDatabase.getInstance().getReference(company_info)


    private val reqchildeventlister = object : ChildEventListener {
        override fun onCancelled(error: DatabaseError) {}

        override fun onChildMoved(snapshot: DataSnapshot, p1: String?) {
        }

        override fun onChildChanged(snapshot: DataSnapshot, p1: String?) {
        }

        override fun onChildAdded(snapshot: DataSnapshot, p1: String?) {

            val getid = snapshot.getValue(Request::class.java)
            val id = getid!!.id
            val requesttype = getid.requesttype
            Log.d(TAG, "Second function to be called")
            Log.d(TAG, "$requesttype request type")
            id?.let { getDetails(it) }
            Log.d(TAG, "$id ID passed")


        }

        override fun onChildRemoved(snapshot: DataSnapshot) {
        }
    }


    fun getRequest() {

        Log.d(TAG, "getRequest method called 1st fun")
        db_chat.child(userid!!).addChildEventListener(reqchildeventlister)

    }

    fun getDetails(id: String) {

        Log.d(TAG, "Second function called")
        db_company.child(id).addChildEventListener(datachildeventlistener)

    }

    private val datachildeventlistener = object : ChildEventListener {
        override fun onCancelled(error: DatabaseError) {

        }

        override fun onChildMoved(snapshot: DataSnapshot, p1: String?) {
        }

        override fun onChildChanged(snapshot: DataSnapshot, p1: String?) {
            Log.d(TAG, "onChildChanged")
            val data = snapshot.getValue(User::class.java)
            data?.id = snapshot.key
            _userdetail.value = data
        }

        override fun onChildAdded(snapshot: DataSnapshot, p1: String?) {

            val data = snapshot.getValue(User::class.java)
            data?.id = snapshot.key
            _userdetail.value = data

        }

        override fun onChildRemoved(snapshot: DataSnapshot) {
        }
    }
}

Класс модели выглядит следующим образом

import com.google.firebase.database.Exclude

data class User(

    @get:Exclude
    var id: String? = null,
    var isAdmin: Boolean? = true,
    var name: String? = null,
    var position: String? = null,
    var contact: String? = null,
    var comname: String? = null,
    var address: String? = null,
    var email: String? = null,
    var website: String? = null


) {
    constructor() : this("", true, "", "", "", "", "", "", "")

}

База данных Firebase Realtime выглядит следующим образом

CHATREQ
    8EFvXhAKTfWuIavGhXlz344bgMD2
      c2HUyNV6sYQImIFqVNMfIaFDTKT2
       id: "c2HUyNV6sYQImIFqVNMfIaFDTKT2"
       request_type: "sent"
   c2HUyNV6sYQImIFqVNMfIaFDTKT2
     8EFvXhAKTfWuIavGhXlz344bgMD2 
      id: "8EFvXhAKTfWuIavGhXlz344bgMD2"
      request_type: "received"
Company_Info
  -M6Ez9RiFRpm8_cn35Pp
User_Info
  8EFvXhAKTfWuIavGhXlz344bgMD2
   admin: false
   contact: "484615674"
   name: "Chetan"
   position: "c"
 c2HUyNV6sYQImIFqVNMfIaFDTKT2
   address: "add"
   admin: true
   comname: "Palekar"
   contact: "549874561" 
   email: "add@gmail.com"
   name: "Kp"
   position: "adfa"
   website: "www.add.com"

В стековой трассировке сказано, что «невозможно преобразовать объект строки в пользовательский класс модели». Надеюсь, кто-нибудь поможет мне в этом. Спасибо за вашу помощь.

1 Ответ

1 голос
/ 01 мая 2020

Вместо использования childEventListener вам необходимо использовать valueEventListener:

private val company_info = "User_Info"
private val db_company = FirebaseDatabase.getInstance().getReference(company_info)

private val reqEventlister = object : ValueEventListener {
    override fun onCancelled(error: FirebaseError?) {
        println(error!!.message)
    }

    override fun onDataChange(snapshot: DataSnapshot?) {
            val getid = snapshot.getValue(Request::class.java)
            val id = getid!!.id
            val requesttype = getid.requesttype
            Log.d(TAG, "Second function to be called")
            Log.d(TAG, "$requesttype request type")
            id?.let { getDetails(it) }
            Log.d(TAG, "$id ID passed")
    }
})


    fun getRequest() {

        Log.d(TAG, "getRequest method called 1st fun")
        db_chat.child(userid!!).addValueEventListener(reqEventlister)

    }

При использовании childEventListener вы напрямую извлекаете дочерние элементы в 8EFvXhAKTfWuIavGhXlz344bgMD2, получая таким образом значения типа String. Вместо этого вам нужно использовать ValueEventListener, который сопоставит ваш класс Request с полученными данными.

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