当我在android应用中使用firebase时,我感觉好像缺少了一些东西。我一直在用

push();


将我的数据放入具有唯一ID的Firebase中。
我一直在使用ChildEventListener在活动中访问此数据:

ref.addChildEventListener(new ChildEventListener() {
    // Retrieve new posts as they are added to the database
    @Override public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
        Map<String, Object> newPost = (Map<String, Object>) snapshot.getValue();
    }
});


我相信

snapshot.getValue()


应该为我提供所有唯一的ID,但是如何订购它们以从最新到最早的顺序显示呢?

谢谢你的帮助!

最佳答案

如果您致电:

ref.push().setValue(anObject);


然后,将使用onChildAdded中的anObject数据触发一次snapshot.getValue()

因此,在此示例中,来自Firebase guide for Android

Firebase postRef = ref.child("posts");

Map<String, String> post1 = new HashMap<String, String>();
post1.put("author", "gracehop");
post1.put("title", "Announcing COBOL, a New Programming Language");
postRef.push().setValue(post1);

Map<String, String> post2 = new HashMap<String, String>();
post2.put("author", "alanisawesome");
post2.put("title", "The Turing Machine");
postRef.push().setValue(post2);


让我们注册我们的onChildAdded侦听器:

ref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
        System.out.println(snapshot.getKey());
    }
};


});

每当将子级添加到我们在其上注册的位置时,都会调用onChildAdded方法。我们添加了两个孩子,因此onChildAdded将被调用两次。第一次将触发gracehop,第二次将触发alanisawesome。每次它将打印相应节点的密钥。

注意:Firebase还会为该位置上的所有现有子代触发onChildAdded事件。因此,它会立即为所有现有的孩子以及添加孩子的孩子触发。

您似乎期望您一次获得所有值。如果这是您要寻找的,则可以使用所谓的ValueListener实现

postRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        System.out.println(snapshot.getValue());
    }
    @Override
    public void onCancelled(FirebaseError firebaseError) {
        System.out.println("The read failed: " + firebaseError.getMessage());
    }
});


请注意,此方法在此处称为onDataChange。因此,只要位置上的数据发生更改,就会调用此方法。由于您在postRef的下面添加了子项,因此onDataChange方法将被调用两次。第一次仅使用gracehop,第二次同时使用gracehopalanisawesome

您可以使用以下命令循环遍历DataSnapshot中的节点:

@Override
public void onDataChange(DataSnapshot snapshot) {
    for (DataSnapshot postSnapshot: snapshot.getChildren()) {
        System.out.println(postSnapshot.getKey());
    }
}


如果我们像以前一样推两个值,onDataChange将触发两次。第一次它将打印gracehop的密钥,第二次将打印gracehop的密钥,然后打印alanisawesome的密钥。因此它将总共打印三个值,其中带有onChildAdded的代码段仅打印两个值。

关于android - Firebase数据排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30700579/

10-09 00:10