Firebase数据库在循环中查询用户

问题描述 投票:0回答:1

例如,我有一个问题列表。每个问题都有所有者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
}

但我确信这种方法不正确。能否请您建议我应该如何构建应用程序的架构?

android firebase-realtime-database kotlin android-architecture-components
1个回答
0
投票

这个:

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)异步性质的更多信息:

© www.soinside.com 2019 - 2024. All rights reserved.