如何从Firebase Realtime Database获取所有用户device token用于发送推送消息
问题原因
你当前的实现存在两个核心错误:
UsersRef指向的是根节点下的Users集合节点,调用UsersRef.getKey()拿到的是字符串"Users",不是你需要的各个用户ID- 你没有遍历
Users节点下的所有子节点,每个子节点的key就是对应用户的ID,遍历后才能拿到每个用户的device_token
另外你找不到get()方法是因为当前集成的Firebase Realtime Database SDK版本低于19.6.0,get()是19.6.0版本才新增的异步读取方法,旧版本使用addListenerForSingleValueEvent实现一次性读取即可。
正确实现代码
DatabaseReference UsersRef = FirebaseDatabase.getInstance().getReference().child("Users"); // 一次性读取所有用户数据,不会监听后续数据变更 UsersRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NotNull DataSnapshot dataSnapshot) { // 存储所有用户device token的列表 List<String> allDeviceTokens = new ArrayList<>(); // 遍历Users下的所有子节点,每个子节点对应一个用户 for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { // 子节点的key即为用户ID,有需要可以单独存储 String userId = userSnapshot.getKey(); // 读取当前用户的device_token字段 if (userSnapshot.hasChild("device_token")) { String deviceToken = userSnapshot.child("device_token").getValue(String.class); if (deviceToken != null && !deviceToken.isEmpty()) { allDeviceTokens.add(deviceToken); } } } // 此处已经获取到全部有效device token,可直接用于推送发送逻辑 Log.d("TOKEN统计", "共获取到" + allDeviceTokens.size() + "个有效设备token"); } @Override public void onCancelled(@NotNull DatabaseError error) { // 读取失败处理,比如权限不足、网络异常等 Log.e("数据库读取失败", error.getMessage()); } });
补充说明
- 如果你需要实时监听用户device token的变更,把
addListenerForSingleValueEvent替换为addValueEventListener即可 - 后续如果要使用
get()方法,只需要将项目中Firebase Realtime Database的依赖版本升级到19.6.0及以上即可
内容的提问来源于stack exchange,提问作者Diego González
相关产品推荐
相关产品推荐

