首页 文章

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

提问于
浏览
24

我有这个firebase数据库

enter image description here

我需要获得所有用户的电话号码,我应该使用哪个听众来获取所有用户?

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

我搜索了文档,它与 DataSnapshot 有关但我没有听众就得不到 DataSnapshot !寻找DataSnapshout是否正确或我是否应该使用其他东西

2 回答

  • 9

    首先检索用户数据快照 .

    //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
                    }
                });
    

    然后循环访问用户,访问他们的 Map 并收集电话字段 .

    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,具体取决于用户的电话实例字段的类型 .

  • 33
    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*/
    

相关问题