如何针对Eggs类的两个构造函数从Firebase检索对应数据?
如何用指定构造函数从Firebase创建Eggs实例
我来帮你搞定这个问题~ 首先得明白:Firebase的getValue(Eggs.class)默认会通过无参构造函数生成实例,然后反射填充所有存在的字段——这没法直接帮你用那两个带参构造函数。所以我们得手动从DataSnapshot里提取需要的字段,再针对性调用构造函数。
方法一:根据字段存在情况创建对应实例
如果你的Firebase节点里,有的节点只存laying字段,有的只存hatching和status,可以这样修改onDataChange方法:
public void onDataChange(@NonNull DataSnapshot dataSnapshot) { ArrayList<Eggs> eg = new ArrayList<>(); for (DataSnapshot breedingSnap : dataSnapshot.getChildren()) { // 逐个提取字段,注意判断是否为null(避免空指针) String laying = breedingSnap.child("laying").getValue(String.class); String hatching = breedingSnap.child("hatching").getValue(String.class); String status = breedingSnap.child("status").getValue(String.class); // 情况1:创建仅包含laying的实例(当laying字段存在时) if (laying != null) { Eggs layingOnlyEgg = new Eggs(laying); eg.add(layingOnlyEgg); } // 情况2:创建包含hatching和status的实例(当两个字段都存在时) if (hatching != null && status != null) { Eggs hatchStatusEgg = new Eggs(hatching, status); eg.add(hatchStatusEgg); } // 要是你想每个节点只生成一种实例,就换成else if逻辑,比如: // if (laying != null && hatching == null && status == null) { // eg.add(new Eggs(laying)); // } else if (hatching != null && status != null && laying == null) { // eg.add(new Eggs(hatching, status)); // } } }
方法二:分开存储两种不同的实例集合
如果你的需求是把两种实例分别放到不同的ArrayList里(比如一个存仅laying的,一个存hatching+status的),可以这么写:
public void onDataChange(@NonNull DataSnapshot dataSnapshot) { ArrayList<Eggs> layingEggsList = new ArrayList<>(); ArrayList<Eggs> hatchStatusEggsList = new ArrayList<>(); for (DataSnapshot breedingSnap : dataSnapshot.getChildren()) { String laying = breedingSnap.child("laying").getValue(String.class); String hatching = breedingSnap.child("hatching").getValue(String.class); String status = breedingSnap.child("status").getValue(String.class); if (laying != null) { layingEggsList.add(new Eggs(laying)); } if (hatching != null && status != null) { hatchStatusEggsList.add(new Eggs(hatching, status)); } } // 之后就可以分别使用这两个集合啦 }
关键注意点
- 字段名要完全匹配:Firebase节点里的字段名(比如"laying")必须和Eggs类的成员变量名大小写一致,否则提取不到值。
- 处理null值:一定要判断字段是否为null,不然如果节点里没有某个字段,直接用getValue会返回null,可能触发空指针异常。
- 为什么不用默认的getValue?因为它会把所有存在的字段都赋值给实例,哪怕你只想用某个构造函数的字段。比如如果节点同时有三个字段,用getValue得到的Eggs实例会三个字段都有值,不符合你的需求。
内容的提问来源于stack exchange,提问作者Yeamin Mahmud
相关产品推荐
相关产品推荐

