如何从Firebase实时数据库的子快照中按键获取值?
获取DataSnapshot里指定键的值
给你三种可行的方法,按需选择即可:
方法一:直接用child()取值
最直接的方式,遍历子快照时,通过child("height")定位到目标字段,再获取对应的值:
dbref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { for (DataSnapshot child : snapshot.getChildren()) { // 直接获取height字段的值 String height = child.child("height").getValue(String.class); Log.d("output", "身高:" + height); } } @Override public void onCancelled(@NonNull DatabaseError error) { // 别忘了处理错误情况,比如权限问题 Log.e("db_error", error.getMessage()); } });
方法二:转成Map后取值
如果需要同时获取多个字段,可以把快照内容转成Map,再通过键名取值:
dbref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { for (DataSnapshot child : snapshot.getChildren()) { Map<String, Object> userData = (Map<String, Object>) child.getValue(); String height = (String) userData.get("height"); Log.d("output", "身高:" + height); } } @Override public void onCancelled(@NonNull DatabaseError error) { Log.e("db_error", error.getMessage()); } });
方法三:用实体类映射(更推荐)
如果数据结构固定,写个实体类对应数据,代码会更规整,后期维护也方便:
首先定义实体类:
public class User { private String name; private int age; private String height; // Firebase反序列化必须要有无参构造 public User() {} // 带参构造和getter、setter方法 public User(String name, int age, String height) { this.name = name; this.age = age; this.height = height; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getHeight() { return height; } public void setHeight(String height) { this.height = height; } }
然后在监听里用实体类解析:
dbref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { for (DataSnapshot child : snapshot.getChildren()) { User user = child.getValue(User.class); if (user != null) { Log.d("output", "身高:" + user.getHeight()); } } } @Override public void onCancelled(@NonNull DatabaseError error) { Log.e("db_error", error.getMessage()); } });
注意:不管用哪种方法,onCancelled方法一定要实现,不然数据库操作出错时无法查看错误日志。
内容的提问来源于stack exchange,提问作者user20211351
相关产品推荐
相关产品推荐

