如何在firebase数据库中获取所有孩子的数据?

Posted

技术标签:

【中文标题】如何在firebase数据库中获取所有孩子的数据?【英文标题】:How to get all child's data in firebase database? 【发布时间】:2016-12-22 06:53:56 【问题描述】:

我有这个 firebase 数据库

我需要获取用户的所有电话号码,我应该使用哪个监听器来获取所有孩子?

每个用户都被添加为一个对象,用户 ID 作为该对象的名称,我需要在不知道该用户 ID 的情况下检索这些对象

我搜索了文档,它与DataSnapshot 相关,但没有听众我无法获得DataSnapshot!寻求 DataSnapshout 是正确的还是我应该使用其他东西

【问题讨论】:

【参考方案1】:
      DatabaseReference ref1= FirebaseDatabase.getInstance().getReference();
      DatabaseReference ref2,ref3,ref4;    
       ref2 = ref1.child("User");


       ref2.addListenerForSingleValueEvent(new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 

            Userlist = new ArrayList<String>();                
            // Result will be holded Here
            for (DataSnapshot dsp : dataSnapshot.getChildren()) 
                  Userlist.add(String.valueOf(dsp.geValue())); //add result into array list

                
    /* userlist will store all values of users, then point to every userlist item 
    and get mobile numbers*/

【讨论】:

这么大的帮助!太感谢了! >3【参考方案2】:

首先检索您的用户数据快照。

//Get datasnapshot at your "users" root node
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users");
    ref.addListenerForSingleValueEvent(
            new ValueEventListener() 
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) 
                    //Get map of users in datasnapshot
                    collectPhoneNumbers((Map<String,Object>) dataSnapshot.getValue());
                

                @Override
                public void onCancelled(DatabaseError databaseError) 
                    //handle databaseError
                
            );

然后遍历用户,访问他们的地图并收集电话字段。

private void collectPhoneNumbers(Map<String,Object> users) 

    ArrayList<Long> phoneNumbers = new ArrayList<>();

    //iterate through each user, ignoring their UID
    for (Map.Entry<String, Object> entry : users.entrySet())

        //Get user map
        Map singleUser = (Map) entry.getValue();
        //Get phone field and append to list
        phoneNumbers.add((Long) singleUser.get("phone"));
    

    System.out.println(phoneNumbers.toString());

此侦听器仅在显式调用时才会检索数据快照。除了您的用户节点之外,考虑在“allPhoneNumbers”节点下存储一个号码列表。这将使您的数据快照在收集所有数字时更轻松、更容易处理。如果您说有数百个用户,“用户”数据快照会太大,而“allPhoneNumbers”列表的效率会高得多。

上面的代码已经在您的示例数据库上进行了测试,并且确实有效。但是,您的电话字段可能需要转换为 String 或 int,具体取决于您用户的电话实例字段的类型。

【讨论】:

感谢 allot,我将使用allPhoneNumbers 的密钥,这真是个好主意 太棒了。 firebase 的个人提示是在写入 firebase (setValue/updateChildren) 时做所有困难的事情,因为您可以更好地控制事情的编写方式。阅读时,您几乎无法控制,因为您必须使用异步侦听器获取节点下的所有内容。因此,通过在写入时组织数据,您可以更轻松地读取数据。 我正在尝试这个。好像比我的专业。

以上是关于如何在firebase数据库中获取所有孩子的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase android kotlin 获取所有具有特定价值的孩子?

如何从 uid Firebase 数据库中获取电子邮件地址?

如何在Android Firebase实时数据库中按降序获取孩子[重复]

如何从孩子的 Firebase 获取数据?

如何在另一个孩子 Firebase 中按孩子订购

Firebase如何向所有孩子添加新数据