未知子节点键名时如何读取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
相关产品推荐
相关产品推荐

