//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());
}
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*/
2 回答
首先检索用户数据快照 .
然后循环访问用户,访问他们的 Map 并收集电话字段 .
此侦听器仅在显式调用时检索数据快照 . 除了用户节点之外,还应考虑在“allPhoneNumbers”节点下存储数字列表 . 这将使您的数据快照更轻,更容易处理收集所有数字 . 如果你说数百个用户,“用户”数据快照将太大,“allPhoneNumbers”列表将更有效率 .
上面的代码在您的示例数据库上进行了测试并且确实有效 . 但是,您的手机字段可能需要转换为String或int,具体取决于用户的电话实例字段的类型 .