当我在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
,第二次同时使用gracehop
和alanisawesome
。您可以使用以下命令循环遍历
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/