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