我正在使用Firebase for Android,并遇到了一些 limitToLast()查询的错误行为。我正在尝试做的是获取列表的最后一个子节点,并遍历此节点的其他子节点:
database.getReference().child("draws").limitToLast(1).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot snap: dataSnapshot.getChildren()){
//Some work
snap.getValue()
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
//Some error handling
}
});
我们假设,我正在使用limitToLast(1)来获取子项 draw / 2 (请参阅下面的数据库快照),这是绘制列表中的最后一个。之后,我正在使用dataSnapshot.getChildren()来获取 draw / 2 节点的子节点列表。迭代通过dataSnapshot.getChildren()列表后我应该得到什么:“85”,“86”,“60”,“7”作为单独的值与循环中的snap.getValue()。toString()。
我真正得到的是,最后一个孩子没有接触到孩子的价值。结果:“[85,86,60,7]”。看起来dataSnapshot.getChildren()不会获得节点 draw / 2 的子节点,而只是获取节点的整个值。
作为测试,我试图摆脱limitToLast(1)查询并用子(“2”)代替,一切正常。
我可能误解了limitToLast()的功能,但是,如果它是真的,我该如何访问最后一个节点的子节点?
答案 0 :(得分:1)
对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。
因此,您的代码需要首先找到draws/2
子项(通过循环),然后然后遍历子项:
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot snap: dataSnapshot.getChildren()){
System.out.println(snap.getKey()); // prints 2
for (DataSnapshot snap2: snap.getChildren()){
//Some work
snap.getValue()
}
}
}
使用addChildEventListener
通常更容易处理查询结果,因为这样您就可以为每个孩子单独调用onChildAdded
(因此可以跳过额外的循环)。