Java Firebase for Android,如何循环遍历一个子项(对于每个子项=x do y)

Java Firebase for Android,如何循环遍历一个子项(对于每个子项=x do y),java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,这就是我的测试结果: 我不会使用上面的字段,它只是一个虚拟的。但我想通过“用户”上的所有子项,并为每封电子邮件返回一个: System.out.println(emailString); 我发现列出对象的唯一方法是使用firebaseAdapter,还有其他方法吗?最简单的方法是使用ValueEventListener FirebaseDatabase.getInstance().getReference().child("users") .addListen

这就是我的测试结果:

我不会使用上面的字段,它只是一个虚拟的。但我想通过“用户”上的所有子项,并为每封电子邮件返回一个:

System.out.println(emailString);

我发现列出对象的唯一方法是使用firebaseAdapter,还有其他方法吗?

最简单的方法是使用ValueEventListener

    FirebaseDatabase.getInstance().getReference().child("users")
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                        User user = snapshot.getValue(User.class);
                        System.out.println(user.email);
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
User
类可以这样定义:

class User {
  private String email;
  private String userId;
  private String username;
  // getters and setters...
}

假设您有一个对节点用户的引用,您可以按如下方式迭代节点:

reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot child : dataSnapshot.getChildren() ){
                // Do magic here
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {}
    });

请注意,for循环中的
DataSnapshot子项将UID作为键,而不是用户。

使用迭代器迭代DataSnapshot

  public void onDataChange(DataSnapshot snapshot) {
            Iterator<DataSnapshot> items = snapshot.getChildren().iterator();
            int counter = 0;
            while (items.hasNext()) {
                DataSnapshot item = items.next();
                Log.i("Result", "email" + item.child("email").getValue().toString());
                Log.i("Result", "User ID" + item.child("userId").getValue().toString());
                Log.i("Result", "User Name" + item.child("username").getValue().toString());
            }
        }
public void onDataChange(DataSnapshot快照){
迭代器项=snapshot.getChildren().Iterator();
int计数器=0;
while(items.hasNext()){
DataSnapshot item=items.next();
Log.i(“结果”、“电子邮件”+item.child(“电子邮件”).getValue().toString());
Log.i(“结果”,“用户ID”+item.child(“用户ID”).getValue().toString());
Log.i(“结果”、“用户名”+item.child(“用户名”).getValue().toString());
}
}

迭代器将遍历用户和项的所有子元素。next()您可以访问用户子元素的子元素

我知道我回答得太晚了,但我必须

 FirebaseDatabase.getInstance().getReference().child("users")
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                      String user = snapshot.child("email").getValue().toString();
                        System.out.println(user);
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
此程序将打印所有用户电子邮件

我期望产量

my@email.com
jonathanwells@email.com
freddyreich@email.com

你是说。怎么了?嗨,这个代码很好用,谢谢。但是,由于某些原因,最后一封电子邮件重复了2次。没关系,已修复。现在我需要弄清楚如何在循环之后执行代码,我键入的每一个代码都在循环之前执行。这里的用户是什么?用户是模型类。我有点被用户模型部分卡住了,你能帮助我如何构造它吗?我很好奇,但不是很糟糕吗?我的意思是在这里它通过所有用户循环(DataSnapshot child:DataSnapshot.getChildren())
,因此如果我们有100个用户,那么加载它将花费很多时间。有没有办法解决这个问题?我的建议是限制通过下载的用户数量,或者你可以使用一个更好的多线程Genius!修正了我的问题,如果你不想使用模型类,这很好。。。我的原始思维发现不必要的模型类,比如脖子上的重物。。。我的原始思维我说这和其他答案有什么不同?这是@rubenlop88答案的复制粘贴,其中一行已更改。这应该是一个注释。@Emil Sierzega我应该只发布onDataChange()方法。
my@email.com
jonathanwells@email.com
freddyreich@email.com