如何从Firebase Database获取所有用户ID?附HashMap存储代码
如何从Firebase Realtime Database中检索所有用户ID?
问题背景
我已经用HashMap将用户数据保存至Firebase Database,用户数据按ID排序,保存代码大致如下:
emailauth = FirebaseAuth.getInstance(); donorid= emailauth.getCurrentUser().getUid(); mrefrnce= FirebaseDatabase.getInstance().getReference().child("Users").child("Donor").child(donorid); HashMap hmap= new HashMap(); hmap.put("user_name",usern); hmap.put("bloodgroup",bld); hmap.put("user_address",address); hmap.put("user_type","Blood Donor"); mrefrnce.updateChildren(hmap).addOnCompleteListener(...);
现在需要咨询如何从该Firebase Database中检索所有用户ID。
解决方案
要获取所有捐赠者的用户ID,核心思路是直接访问Users/Donor节点,遍历它的所有子节点——每个子节点的key就是你保存数据时用的用户ID(也就是donorid)。下面给你两种常用的实现方式:
1. 实时监听版本(自动更新数据)
这个版本会实时监听Donor节点的变化,一旦有用户新增、删除或信息修改,都会自动更新用户ID列表:
// 获取Donor节点的根引用 DatabaseReference donorRootRef = FirebaseDatabase.getInstance().getReference().child("Users").child("Donor"); // 创建值事件监听器 ValueEventListener donorListener = new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { List<String> allDonorIds = new ArrayList<>(); // 遍历所有子节点,提取每个节点的key(即用户ID) for (DataSnapshot donorSnapshot : dataSnapshot.getChildren()) { String userId = donorSnapshot.getKey(); allDonorIds.add(userId); // 如果你需要同时获取该用户的详细数据,可以在这里解析: // DonorModel donor = donorSnapshot.getValue(DonorModel.class); } // 这里可以处理获取到的ID列表,比如打印到日志、更新UI等 Log.d("FirebaseData", "所有捐赠者ID: " + allDonorIds); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { // 处理数据读取失败的情况 Log.e("FirebaseError", "读取用户ID失败", databaseError.toException()); } }; // 添加监听器到节点 donorRootRef.addValueEventListener(donorListener);
2. 单次读取版本(非实时)
如果只需要一次性获取当前所有用户ID,不需要实时更新,可以使用addListenerForSingleValueEvent,读取完成后会自动移除监听器,更节省资源:
donorRootRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { List<String> allDonorIds = new ArrayList<>(); for (DataSnapshot donorSnapshot : dataSnapshot.getChildren()) { allDonorIds.add(donorSnapshot.getKey()); } // 在这里处理获取到的ID列表 } @Override public void onCancelled(@NonNull DatabaseError databaseError) { // 处理读取失败的异常 Log.e("FirebaseError", "读取用户ID失败", databaseError.toException()); } });
额外注意事项
- 如果你用了实时监听器,记得在页面销毁时(比如Activity的
onDestroy方法)移除监听器,避免内存泄漏:@Override protected void onDestroy() { super.onDestroy(); donorRootRef.removeEventListener(donorListener); } - 确保你的Firebase数据库规则允许读取
Users/Donor节点,否则会出现权限被拒绝的错误。
内容的提问来源于stack exchange,提问作者Ahsan Sherazi
相关产品推荐
相关产品推荐

