如何在Kotlin中从Realtime迁移到Firestore数据库

时间:2019-06-09 09:54:42

标签: android firebase firebase-realtime-database kotlin google-cloud-firestore

我正在将我的应用程序从实时数据库转移到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 :(得分:0)

在Firestore中使用addSnapshotListener时,您会得到一个QuerySnapshot,其中包含与usersDb相匹配的所有文档

另一方面,您正在使用的onChildAdded实时数据库代码会被usersDb匹配的每个单个节点调用。

因此,要获得与Firestore代码相同的级别,您需要遍历QuerySnapshot中的文档。有关此示例,请参见getting multiple documents from a collection上的文档:

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()相似。