Firebase:如何获取特定集合的元素?

时间:2020-05-11 01:13:44

标签: android firebase firebase-realtime-database

我正在使用以下数据,我想知道如何轻松获得brainstormWords

enter image description here

现在我正在使用这个

FirebaseDatabse.getInstance().getReference("Users")
    .child(mUser.uid).addChildEventListener(object : ChildEventListener {

    override fun onChildChanged(snapshot: DataSnapshot, p1: String?) {
        val brainstormWords = arrayListOf<Pack>()
        for (data in snapshot.children) {
            if (snapshot.key == "brainstormWords") {
                val word = data.getValue(Pack::class.java)!!
                if (word.word.isNotEmpty()) {
                    brainstormWords.add(word)
                }
            }
        }
        if (brainstormWords.isNotEmpty()) {
            trainingPack.postValue(brainstormWords)
        }
    }
}

但是,如果有许多可以动态更改的集合,它将不会很方便。也许我可以通过简单地指定集合的​​路径以某种方式从brainstormWords获取所有数据?

1 个答案:

答案 0 :(得分:1)

Firebase始终加载完整的节点。无法仅加载每个节点的brainstormWords子级。如果只想加载那些,最好的方法是创建一个顶层列表brainstormWords,该列表具有您现在拥有的相同子节点,但每个子节点仅包含brainstormWords的内容。

有关详细信息,请参阅avoiding nested dataflattening data structure上的Firebase文档。


另外请注意:在当前节点中,您无需遍历所有子节点即可找到brainstormWords。您可以改为使用DataSnapshot.child()

FirebaseDatabse.getInstance().getReference("Users")
    .child(mUser.uid).addChildEventListener(object : ChildEventListener {

    override fun onChildChanged(snapshot: DataSnapshot, p1: String?) {
        val brainstormWords = arrayListOf<Pack>()
        val word = data.child("brainstormWords").getValue(Pack::class.java)!!
        if (word.word.isNotEmpty()) {
            brainstormWords.add(word)
        }
        if (brainstormWords.isNotEmpty()) {
            trainingPack.postValue(brainstormWords)
        }
    }
}