例如,我有一个问题列表。每个问题都有所有者uid。通过这个uid,我应该找到所需的用户并显示他的名字和照片。我使用帮助架构组件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
方法返回用户。这是因为数据是从Firebase异步加载的,并且在执行return
语句时,尚未调用onDataChange
。
我建议您阅读上述有关该主题的一些问题,以了解有关处理Firebase(以及大多数现代Web)异步性质的更多信息: