我正在将我的应用程序从实时数据库转移到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。让我知道您是否会做其他事情
答案 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()
相似。