Firebase 数据库循环查询用户
Firebase Database query users in a loop
例如,我有一个问题列表。每个问题都有所有者 uid。通过这个 uid,我应该找到需要的用户并显示他的名字和照片。我用 help architecture component ViewModel:
issues.forEach {
IssueRepository().getIssueOwner(it.owner).observe(this, Observer {
})
}
getIssueOwner 方法:
fun getIssueOwner(uid: String): MutableLiveData<UserEntity> {
val user: MutableLiveData<UserEntity> = MutableLiveData()
val usersReference = FirebaseDatabase.getInstance().reference.child("users")
val query = usersReference.orderByKey().equalTo(uid).limitToFirst(1)
query.addValueEventListener(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError?) {
}
override fun onDataChange(dataSnapshot: DataSnapshot?) {
if (dataSnapshot == null) {
return
}
dataSnapshot.children.forEach {
val name = it.child("displayName").value
user.postValue(UserEntity(name))
}
}
})
return user
}
但我敢肯定这种做法是不正确的。您能否给我一个建议,我应该如何构建我的应用程序架构?
这个:
val query = usersReference.orderByKey().equalTo(uid).limitToFirst(1)
给出完全相同的结果,因为这个更简单:
val userReference = usersReference.child(uid)
两者之间的唯一区别是,第一个代码段为您提供了包含一个项目列表的快照,而第二个代码段为您提供了仅包含该项目的快照。
val userReference = usersReference.child(uid)
userReference.addValueEventListener(object : ValueEventListener {
override fun onCancelled(error: DatabaseError?) {
throw error.toException() // don't ignore errors
}
override fun onDataChange(dataSnapshot: DataSnapshot?) {
if (dataSnapshot.exists()
val name = dataSnapshot.child("displayName").value
user.postValue(UserEntity(name))
}
}
})
请注意,您仍然无法通过 getIssueOwner
方法 return 用户。这是因为数据是从 Firebase 异步加载的,并且在执行 return
语句时,尚未调用 onDataChange
。
我建议您阅读之前关于该主题的一些问题,以了解更多关于处理 Firebase(以及大多数现代网络)的异步特性的信息:
- Wait Firebase async retrive data in android
例如,我有一个问题列表。每个问题都有所有者 uid。通过这个 uid,我应该找到需要的用户并显示他的名字和照片。我用 help architecture component ViewModel:
issues.forEach {
IssueRepository().getIssueOwner(it.owner).observe(this, Observer {
})
}
getIssueOwner 方法:
fun getIssueOwner(uid: String): MutableLiveData<UserEntity> {
val user: MutableLiveData<UserEntity> = MutableLiveData()
val usersReference = FirebaseDatabase.getInstance().reference.child("users")
val query = usersReference.orderByKey().equalTo(uid).limitToFirst(1)
query.addValueEventListener(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError?) {
}
override fun onDataChange(dataSnapshot: DataSnapshot?) {
if (dataSnapshot == null) {
return
}
dataSnapshot.children.forEach {
val name = it.child("displayName").value
user.postValue(UserEntity(name))
}
}
})
return user
}
但我敢肯定这种做法是不正确的。您能否给我一个建议,我应该如何构建我的应用程序架构?
这个:
val query = usersReference.orderByKey().equalTo(uid).limitToFirst(1)
给出完全相同的结果,因为这个更简单:
val userReference = usersReference.child(uid)
两者之间的唯一区别是,第一个代码段为您提供了包含一个项目列表的快照,而第二个代码段为您提供了仅包含该项目的快照。
val userReference = usersReference.child(uid)
userReference.addValueEventListener(object : ValueEventListener {
override fun onCancelled(error: DatabaseError?) {
throw error.toException() // don't ignore errors
}
override fun onDataChange(dataSnapshot: DataSnapshot?) {
if (dataSnapshot.exists()
val name = dataSnapshot.child("displayName").value
user.postValue(UserEntity(name))
}
}
})
请注意,您仍然无法通过 getIssueOwner
方法 return 用户。这是因为数据是从 Firebase 异步加载的,并且在执行 return
语句时,尚未调用 onDataChange
。
我建议您阅读之前关于该主题的一些问题,以了解更多关于处理 Firebase(以及大多数现代网络)的异步特性的信息:
- Wait Firebase async retrive data in android