我有这个 firebase 数据库
并且我需要获取用户的所有电话号码,我应该使用哪个监听器来获取所有 child ?
每个用户都被添加为一个对象,用户 ID 作为该对象的名称,我需要在不知道该用户 ID 的情况下检索这些对象
我搜索了文档,它与 DataSnapshot
相关,但没有监听器我无法获得 DataSnapshot
!寻求 DataSnapshout 是正确的还是我应该使用其他东西
最佳答案
首先检索您的用户数据快照。
//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,具体取决于您用户的电话实例字段的类型。
关于android - 如何在firebase数据库中获取所有 child 的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38965731/