You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase获取唯一键下tmpHR子节点值返回null问题求助

解决Firebase Realtime Database获取tmpHR返回null的问题

我来帮你排查这个问题,你遇到的tmpHR返回null的情况,主要是循环层级错误和变量作用域问题导致的,咱们一步步拆解解决:

问题分析

  1. 监听层级理解错误:你给nilaihr节点添加了ChildEventListener,当nilaihr下新增一个随机唯一键节点时,onChildAdded里的dataSnapshot已经直接指向这个唯一键节点(也就是包含tmpHR和Date的那个节点),不需要再嵌套for (DataSnapshot uniqueKeySnapshot : dataSnapshot.getChildren())循环——这个循环会遍历tmpHR和Date这两个子节点,而你要的tmpHR是在唯一键节点下,不是它的子节点的子节点。
  2. 变量作用域冲突:你在onChildAdded里定义了局部的Integer hrValue,但showData方法调用的是全局的hrValue,全局变量根本没被赋值,所以array1里添加的都是初始的null值。
  3. 数据类型兼容问题:Firebase Realtime Database会把整数存储为Long类型(即使你存的是Integer),直接用getValue(Integer.class)可能会出现类型不匹配,建议先转为Number再转成int。

修正后的代码

Integer hrValue; 
ArrayList<Integer> array1 = new ArrayList<>(); 

DatabaseReference userdatabase = FirebaseDatabase.getInstance().getReference().child("Users");
DatabaseReference ref = userdatabase.child(user.getUid()).child("hrvalue").child("nilaihr");

ref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        // dataSnapshot就是每个随机唯一键对应的节点,直接读取tmpHR
        Number hrNumber = dataSnapshot.child("tmpHR").getValue(Number.class);
        if (hrNumber != null) {
            hrValue = hrNumber.intValue();
            Log.i("heart rate value", "hrvalue " + hrValue);
            showData(dataSnapshot);
        } else {
            Log.i("heart rate value", "tmpHR节点不存在或值为null");
        }
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {}

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {}

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {}

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e("Firebase Error", databaseError.getMessage());
    }
});

private void showData(DataSnapshot dataSnapshot) {
    if (hrValue != null) {
        array1.add(hrValue);
        Log.i("database array", "array database " + array1.toString());
    }
}

额外验证建议

  • 确认你的数据库结构确实是:Users -> [用户UID] -> hrvalue -> nilaihr -> [随机唯一键] -> tmpHR (Integer)、Date (String)
  • 可以在onChildAdded里打印dataSnapshot.getValue().toString(),查看该节点下的完整数据,确认tmpHR是否存在且有值。

内容的提问来源于stack exchange,提问作者Astrid Gloria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:57:22