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

未知子节点键名时如何读取Firebase Realtime Database的子节点值

问题解决方法

问题根源

你使用push()方法写入数据时,Firebase Realtime Database会自动在Distance、Speed、Time节点下生成唯一随机键作为子节点,实际的数值存储在这个随机键的下层。你之前直接将整个Distance节点转为字符串,会把键值对整体输出,所以会带出自动生成的键名。

修改后的读取代码

mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
// 优化:无需按email查询,直接用uid获取对应节点,查询效率更高
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(user.getUid());

reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        // 读取Distance值
        String distance1 = "";
        DataSnapshot distanceSnapshot = dataSnapshot.child("Distance");
        for (DataSnapshot ds : distanceSnapshot.getChildren()) {
            // 这里的类型根据你存入的LastValueRounded类型调整,如为Double则用Double.class
            distance1 = ds.getValue().toString();
            // 只取最新的一条数据就加break,要读取所有历史数据就去掉break,存入列表即可
            break;
        }
        
        // 读取Speed值
        String speed1 = "";
        DataSnapshot speedSnapshot = dataSnapshot.child("Speed");
        for (DataSnapshot ds : speedSnapshot.getChildren()) {
            speed1 = ds.getValue().toString();
            break;
        }
        
        // 读取Time值
        String time1 = "";
        DataSnapshot timeSnapshot = dataSnapshot.child("Time");
        for (DataSnapshot ds : timeSnapshot.getChildren()) {
            time1 = ds.getValue().toString();
            break;
        }
        
        distance.setText(distance1);
        speed.setText(speed1);
        time.setText(time1);
    }        

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.w("ERROR", "onCancelled", databaseError.toException());
    }
});

可选优化建议

如果你只需要存储最新的一条距离、速度、时间数据,不需要保留历史记录,写入时可以去掉push()直接覆盖值,后续读取也无需遍历:

// 写入时的优化代码
reference.child(user.getUid()).child("Distance").setValue(LastValueRounded);
reference.child(user.getUid()).child("Speed").setValue(averagespeed);
reference.child(user.getUid()).child("Time").setValue(getTimerText());

内容的提问来源于stack exchange,提问作者Ece Öğretmen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:06:02