Как получить содержимое документа из Firestore по пользовательскому объекту?(Android - Котлин) - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь получить содержимое документа из Firestore.Следующая ссылка на изображение показывает структуру базы данных Структура базы данных Firestore

Что я хочу: Я хочу получить содержимое документа с помощью пользовательского объекта и добавить его вlist.

Проблема: Я получаю эту ошибку: E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com.example.aalmesbah.turoodpilot, PID: 12160 Java.lang.RuntimeException: не удалось десериализовать объект.Класс com.google.firebase.auth.UserInfo не определяет конструктор без аргументов.Если вы используете ProGuard, убедитесь, что эти конструкторы не удалены

Я пытался получить содержимое документа с помощью методов get () и getString () , и проблема работала нормально.только с toObject () ?

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

код класса данных:

data class UserInfo (val name: String? = "",
                 val email: String? = "",
                 val phoneNum: String? = "",
                 val address: String? = "") {
    constructor(): this("","","", "" )

}

Код фрагмента профиля: (где предполагается, что содержимое документапоказано)

class ProfileFragment : Fragment() {

private lateinit var auth: FirebaseAuth
private lateinit var db: FirebaseFirestore


override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    val view = inflater.inflate(R.layout.fragment_profile, container, false)

    auth = FirebaseAuth.getInstance()
    db = FirebaseFirestore.getInstance()

    return view
}

override fun onStart() {
    super.onStart()

    val userID = auth.currentUser?.uid
    val docRef = db.collection("users").document(userID!!)

    docRef.addSnapshotListener(EventListener<DocumentSnapshot> { documentSnapshot, e ->

    if (e != null) {
            Log.w(TAG, "Listen failed.", e)
            return@EventListener
        }

        if (documentSnapshot != null && documentSnapshot.exists()) {

            docRef.get().addOnSuccessListener { documentSnapshot ->
                val userInfo = documentSnapshot.toObject(UserInfo::class.java)

                emailTV.text = userInfo?.email
            }
        } else {

                Log.d(TAG, "Current data: null")
            }

        })


}

}

код метода sendUserData () при операции регистрации

private fun sendUserData() {

    val name = userN.text.toString()
    val email = userEm.text.toString()
    val phone = userPhone.text.toString()
    val addressName = addressName.text.toString()
    val area = area.text.toString()
    val block = block.text.toString()
    val street = strees.text.toString()
    val avenue = avenue.text.toString()
    val house = house.text.toString()
    val floor = floor.text.toString()
    val apartment = apartment.text.toString()
    val additionalInfo = additional.text.toString()

    val address = "Addres Name: $addressName \n Area: $area \n B: $block ST: $street Av: $avenue H: $house\n " +
            "Floor: $floor Apartment: $apartment \n Notes: $additionalInfo"

    val userID = auth.currentUser?.uid

    val userData = UserInfo(name, email, phone, address)

    db.collection("users").document(userID!!).set(userData).addOnSuccessListener {
            Toast.makeText(this, "Successfully Registered", Toast.LENGTH_SHORT).show()
        }.addOnFailureListener{
        Toast.makeText(this, "Data Upload error!", Toast.LENGTH_SHORT).show()
        }


}    

1 Ответ

0 голосов
/ 01 января 2019

Если вы хотите использовать класс данных Kotlin с documentSnapshot.toObject, вам нужно будет сделать каждое поле обнуляемым var вместо val.Пакет Firestore SDK не знает, как сопоставить поля документа с аргументом конструктора класса данных.

Если вам нужен правильный неизменяемый класс данных с полями val, вам придется вручную читать каждое поле издокумента и вызовите конструктор класса данных самостоятельно.

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