我正在使用以下数据,我想知道如何轻松获得brainstormWords
?
现在我正在使用这个
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
获取所有数据?
答案 0 :(得分:1)
Firebase始终加载完整的节点。无法仅加载每个节点的brainstormWords
子级。如果只想加载那些,最好的方法是创建一个顶层列表brainstormWords
,该列表具有您现在拥有的相同子节点,但每个子节点仅包含brainstormWords
的内容。
有关详细信息,请参阅avoiding nested data和flattening 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)
}
}
}