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

如何针对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:33:10