Android端Firebase动态键值对Model类创建及节点数据查询方法
1. 为Firebase动态键值对结构创建Model类
Firebase的动态键场景无需在Model中预定义键名,使用Map<String, 子结构Model>承接动态键部分即可,步骤如下:
- 首先定义动态键对应值的固定结构Model,注意必须保留无参构造方法供Firebase反序列化使用:
public class ChildItem { // 替换为你实际子节点包含的字段 private String name; private int age; private String contact; // 必须的无参构造 public ChildItem() {} // 自行补充有参构造、getter、setter方法 public String getName() { return name; } public int getAge() { return age; } public String getContact() { return contact; } }
- 如果外层还有其他固定字段,可定义外层Root Model,将动态键部分声明为Map类型:
public class RootModel { // 可补充其他外层固定字段 private Long updateTime; // Map的key对应动态生成的节点键,value对应上面定义的子结构Model private Map<String, ChildItem> dynamicNodeMap; public RootModel() {} public Map<String, ChildItem> getDynamicNodeMap() { return dynamicNodeMap; } public Long getUpdateTime() { return updateTime; } }
注意:Map的泛型必须明确指定子Model类型,不能使用模糊的Object类型,否则Firebase无法完成自动反序列化
2. 获取所有动态键节点及对应值
拿到反序列化后的Map后直接遍历即可同时获取键与值,常见查询场景的代码如下:
- 直接查询动态键所在父节点的处理逻辑:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("你的父节点路径"); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // 用GenericTypeIndicator指定Map的泛型类型完成转换 GenericTypeIndicator<Map<String, ChildItem>> typeIndicator = new GenericTypeIndicator<Map<String, ChildItem>>() {}; Map<String, ChildItem> dynamicMap = snapshot.getValue(typeIndicator); if (dynamicMap != null) { // 遍历获取每一组键值对 for (Map.Entry<String, ChildItem> entry : dynamicMap.entrySet()) { String dynamicKey = entry.getKey(); // 获取动态键 ChildItem itemValue = entry.getValue(); // 获取对应的值对象 // 此处编写业务处理逻辑 } // 仅需获取所有键时调用 dynamicMap.keySet() // 仅需获取所有值时调用 dynamicMap.values() } } @Override public void onCancelled(@NonNull DatabaseError error) { // 编写异常处理逻辑 } });
- 已获取RootModel对象时的处理逻辑:
Map<String, ChildItem> dynamicMap = rootModel.getDynamicNodeMap(); // 后续遍历逻辑和上述完全一致
内容的提问来源于stack exchange,提问作者Sourabh Kumar
相关产品推荐
相关产品推荐

