【问题标题】:Firebase for Android, How can I loop through a child (for each child = x do y)Firebase for Android,我如何循环遍历一个孩子(对于每个孩子 = x do y)
【发布时间】:2017-03-14 23:37:45
【问题描述】:

这是我的测试的样子:

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

System.out.println(emailString);

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

【问题讨论】:

标签: java android firebase firebase-realtime-database


【解决方案1】:

最简单的方法是使用 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...
}

【讨论】:

  • 嗨,这段代码运行良好,谢谢。但是,由于某种原因,最后一封电子邮件重复了 2 次。
  • 没关系,修好了。现在我需要弄清楚如何执行一个代码after那个循环,我输入的每个代码都执行它before
  • 这里的用户是什么?
  • User是模型类
  • 我在用户模型部分有点卡住了,你能帮我看看我应该如何构建它吗?
【解决方案2】:
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference();
myRef.addValueEventListener(new ValueEventListener() {
 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
    for(DataSnapshot item_snapshot:dataSnapshot.getChildren()) {

      Log.d("item id ",item_snapshot.child("item_id").getValue().toString());
      Log.d("item desc",item_snapshot.child("item_desc").getValue().toString());
     }
  }
}

【讨论】:

  • 天才!解决了我的问题
  • 如果你不想使用模型类,那就太好了……我的原始思维发现了不必要的模型类,比如脖子上的重物……我说的是我的原始思维
【解决方案3】:

假设你有一个节点 users 的引用,你可以按如下方式遍历节点:

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 child 将以 UID 作为键,而不是 users

【讨论】:

  • 我很好奇,但这不是很糟糕吗?我的意思是它通过所有用户循环for(DataSnapshot child : dataSnapshot.getChildren() ),所以如果我们有 100 个用户,它会花费很多时间来加载。有没有办法解决这个问题?
  • 我的建议是限制通过Query 下载的用户数量,或者您可以使用ChildEventListener 以获得更好的多线程处理
【解决方案4】:

使用Iterator遍历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());
            }
        }

迭代器将遍历用户的所有子元素,并且使用 items.next() 您可以访问用户子元素的子元素

【讨论】:

    【解决方案5】:

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

     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
    

    【讨论】:

    • 这与其他答案有何不同?这是@rubenlop88 答案的复制粘贴,其中一行已更改。这应该是一条评论。
    • @Emil Sierzega 我应该只发布 onDataChange() 方法。
    猜你喜欢
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2021-06-01
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多