2016-08-16 111 views
19

我有这个火力点数据库如何在Firebase数据库中获取所有孩子的数据?

enter image description here

,我需要得到所有用户的电话号码,这听者应我用它来获取所有CHILDES?

每一个用户被添加作为具有用户ID的对象为对象的名字,我需要检索这个对象不知道用户ID

我搜索的文件,它涉及到DataSnapshot但我不能如果没有听众,你会得到一个DataSnapshot!是否正确寻找DataSnapshout或我应该使用其他方法

回答

26

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

//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”列表将更有效率。

上述代码已在您的示例数据库上进行了测试,并且可以正常工作。但是,根据用户的电话实例字段的类型,您的电话字段可能需要转换为字符串或整数。

+0

感谢allot,我将使用'allPhoneNumbers'的一个键,这真的是个好主意 – mxml

+0

真棒。在写入firebase(setValue/updateChildren)时,使用Firebase的个人提示会完成所有困难的工作,因为您可以更好地控制写入内容的方式。阅读时,您几乎不能控制,因为您必须抓取具有异步侦听器的节​​点下的所有内容。因此,通过在撰写时组织数据,您可以更轻松地读取数据。 –

7
 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*/ 
+0

感谢分配,你说的很清楚 – mxml

相关问题