Как перейти с базы данных в реальном времени на Firestore в kotlin - PullRequest
0 голосов
/ 09 июня 2019

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

Моя функция - получать информацию о пользователе из базы данных. Это выглядит так:

fun getUsersInfo() {


    usersDb!!.addSnapshotListener(EventListener<QuerySnapshot> { snapshot, e ->


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


             //retrieve documents and set name, age, etc.


        }


    })
}

Но я не уверен, как ссылаться на документы, поскольку в QuerySnapshot нет команды get, в отличие от DocumentSnapshot

Вот старый код в реальном времени, который я пытаюсь перенести:

usersDb!!.addSnapshotListener(object : ChildEventListener {
        override fun onChildAdded(dataSnapshot: DataSnapshot, s: String?) {
            if (dataSnapshot.child("sex").value != null) {
                if (dataSnapshot.key == FirebaseAuth.getInstance().uid)
                    return

                if (dataSnapshot.exists() && !dataSnapshot.child("connections").child("nope").hasChild(currentUId!!) && !dataSnapshot.child("connections").child("yeps").hasChild(currentUId!!)) {
                    if (dataSnapshot.child("sex").value!!.toString() == userInterest || userInterest == "Both") {
                        var name = ""
                        var age = ""
                        var job = ""
                        var about = ""
                        //  var userSex = ""
                        var profileImageUrl = "default"

                        if (dataSnapshot.child("name").value != null)
                            name = dataSnapshot.child("name").value!!.toString()
                        //  if (dataSnapshot.child("sex").value != null)
                        //     userSex = dataSnapshot.child("sex").value!!.toString()
                        if (dataSnapshot.child("age").value != null)
                            age = dataSnapshot.child("age").value!!.toString()
                        if (dataSnapshot.child("job").value != null)
                            job = dataSnapshot.child("job").value!!.toString()
                        if (dataSnapshot.child("about").value != null)
                            about = dataSnapshot.child("about").value!!.toString()
                        if (dataSnapshot.child("profileImageUrl").value != null)
                            profileImageUrl = dataSnapshot.child("profileImageUrl").value!!.toString()

                        val item = cardObject(dataSnapshot.key!!, name, age, about, job, profileImageUrl)

                        for (i in rowItems.indices)
                            if (rowItems[i] === item)
                                return

                        rowItems.add(item)
                        cardAdapter!!.notifyDataSetChanged()
                    }
                }
            }
        }

        override fun onChildChanged(dataSnapshot: DataSnapshot, s: String?) {}
        override fun onChildRemoved(dataSnapshot: DataSnapshot) {}

        override fun onChildMoved(dataSnapshot: DataSnapshot, s: String?) {}
        override fun onCancelled(databaseError: DatabaseError) {}
    })

По сути, это просто проверка, если пользователи одного пола, и проверка, чтобы не добавлять текущего пользователя в массив

Приносим свои извинения, если код трудно читать, я впервые использую firebase. Дайте мне знать, если бы вы сделали что-то по-другому

1 Ответ

0 голосов
/ 09 июня 2019

Когда вы используете addSnapshotListener в Firestore, вы получаете QuerySnapshot, который содержит все документы , соответствующие usersDb.

С другой стороны, ваш код для базы данных реального времени, которую вы используете onChildAdded, которая вызывается для каждого отдельного узла , совпадающего usersDb.

Такчтобы достичь того же уровня в вашем коде Firestore, вам нужно перебрать документы в QuerySnapshot.Пример этого см. В документации по получению нескольких документов из собрания :

db.collection("cities")
  .whereEqualTo("state", "CA")
  .addSnapshotListener { value, e ->
      if (e != null) {
          Log.w(TAG, "Listen failed.", e)
          return@addSnapshotListener
      }

      val cities = ArrayList<String>()
      for (doc in value!!) {
          doc.getString("name")?.let {
              cities.add(it)
          }
      }
      Log.d(TAG, "Current cites in CA: $cities")
  }

. В приведенном выше примере переменная it представляет собой DocumentSnapshot, который имеет методы, аналогичные getValue(), которые вы знаете из базы данных реального времени.

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