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

Firebase数据库读取第二个值返回null问题求助

Firebase读取Scholar_id对应图片返回null的问题解决

问题根源

  • Scholar_id格式不匹配:数据库中第二个回答的Scholar_id带有前导空格(" 11111513710"),但images节点下的对应key是无空格的"11111513710",导致查询时找不到匹配节点,返回null。
  • 代码循环逻辑冗余:内层循环获取Scholar_id后直接break,虽当前数据结构下能运行,但逻辑不够严谨,且未处理字符串空格问题。

解决方案

1. 统一Scholar_id格式

要么在写入数据时对Scholar_id执行trim()去除前后空格,要么在读取时做去空格处理,确保和images节点的key完全匹配。

2. 优化数据读取代码

简化循环逻辑,同时处理Scholar_id的空格问题,修正后的代码如下:

DatabaseReference answersRef = database.getReference("QnA/Answers/" + pushkey);
List<String> scholarIds = new ArrayList<>();

answersRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot answerSnapshot : dataSnapshot.getChildren()) {
            // 直接获取最内层的学者节点(每个answerSnapshot下仅一个子节点)
            DataSnapshot scholarSnapshot = answerSnapshot.getChildren().iterator().next();
            String scholarId = scholarSnapshot.child("Scholar_id").getValue(String.class);
            
            // 去除前后空格,避免匹配失败
            if (scholarId != null) {
                scholarId = scholarId.trim();
                scholarIds.add(scholarId);
            }
        }

        for (String scholarId : scholarIds) {
            DatabaseReference imagesRef = database.getReference().child("images").child(scholarId);
            imagesRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    String imageUrl = dataSnapshot.child("images").getValue(String.class);
                    System.out.println("Scholar ID: " + scholarId + ", Image URL: " + imageUrl);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    System.out.println("Error reading image data: " + databaseError.getMessage());
                }
            });
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        System.out.println("Error reading answer data: " + databaseError.getMessage());
    }
});

额外建议

  • 优先在数据写入阶段处理Scholar_id的空格问题,从源头避免匹配错误。
  • 可以定义POJO类映射Firebase的回答数据,减少手动解析的代码量和出错概率。

内容的提问来源于stack exchange,提问作者Remo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:57:03