Android Firebase奇怪的limitToLast(1)行为

时间:2017-01-31 10:52:30

标签: android firebase firebase-realtime-database

我正在使用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()。

enter image description here

我真正得到的是,最后一个孩子没有接触到孩子的价值。结果:“[85,86,60,7]”。看起来dataSnapshot.getChildren()不会获得节点 draw / 2 的子节点,而只是获取节点的整个值。

作为测试,我试图摆脱limitToLast(1)查询并用子(“2”)代替,一切正常。

我可能误解了limitToLast()的功能,但是,如果它是真的,我该如何访问最后一个节点的子节点?

1 个答案:

答案 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(因此可以跳过额外的循环)。

顺便说一句:documentation for the Firebase Database doesn't use arrays甚至recommends against using arrays有很多原因。忽视他们是你自己的危险。