【问题标题】:Android Firebase weird limitToLast(1) behaviourAndroid Firebase 奇怪的 limitToLast(1) 行为
【发布时间】:2017-01-31 22:47:04
【问题描述】:

我正在使用适用于 Android 的 Firebase,但遇到了 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) 来获取子 draws/2(请参阅下面的数据库快照),它是抽奖列表中的最后一个。之后,我使用 dataSnapshot.getChildren() 来获取 draws/2 节点的子节点列表。遍历 dataSnapshot.getChildren() 列表后我应该得到什么:“85”、“86”、“60”、“7”作为循环中的 snap.getValue().toString() 单独的值。

我实际上得到的是最后一个孩子的价值,而没有访问它的孩子。结果:“[85, 86, 60, 7]”。看起来 dataSnapshot.getChildren() 没有获取节点 draws/2 的子节点,而只是获取节点的整个值。

作为测试,我尝试摆脱 limitToLast(1) 查询并用 child("2") 替换,一切正常。

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

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案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 的原因有很多。忽略它们,后果自负。

    【讨论】:

    • 谢谢你,弗兰克!确实,这就是我一直在寻找的。很高兴您在 StackOverflow 上积极主持 Firebase 主题。你的回答很有帮助
    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 2015-11-25
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多