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

Android Studio中无法从Firebase Realtime Database读取数据求助

问题描述

数据库结构截图

我想要访问数据库中的img数据,但尝试后没有任何效果。

代码如下:

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("med");

System.out.println(myRef);
System.out.println(database.getReference().child("med"));

database.getReference().child("med").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("11111111");
    }

    @Override
    public void onCancelled(DatabaseError error) {
        // Failed to read value
        Log.w(TAG, "Failed to read value.", error.toException());
    }
});

进入onDataChange函数时,连11111111都没有打印出来。

问题出在哪里?我该如何获取所需的数据?


排查方向与解决方法

1. 数据库安全规则限制

Firebase Realtime Database 默认规则仅允许已认证用户读写,若你的应用未配置用户认证、或当前无登录用户,数据库会直接拒绝访问请求,导致onDataChange完全不触发,甚至可能不会走到onCancelled回调。

解决方式:

  • 测试阶段可临时开放规则(上线前必须修改为安全规则):
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
  • 正式环境需配置对应认证规则,比如限定特定用户、或符合业务逻辑的访问权限。

2. 数据库引用路径错误

从截图看,med节点下是带ID的子节点,若你的引用路径拼写错误(比如大小写、空格、额外字符),会导致监听的节点不存在,也会出现onDataChange不触发的情况。

确认方式:
打印myRef.toString()查看完整数据库URL,对比Firebase控制台的实际数据路径是否完全一致。

3. 组件生命周期导致监听器被回收

若这段代码在Activity/Fragment的生命周期方法(如onCreate)中执行,但组件很快被销毁(比如页面跳转),监听器可能还未触发就被系统回收。

解决方式:
保存监听器实例,在组件销毁时主动移除:

private ValueEventListener medListener;

// 初始化时保存监听器
medListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("11111111");
        // 遍历子节点获取img数据
        for (DataSnapshot childSnap : dataSnapshot.getChildren()) {
            String imgUrl = childSnap.child("img").getValue(String.class);
            System.out.println("img地址:" + imgUrl);
        }
    }

    @Override
    public void onCancelled(DatabaseError error) {
        Log.w(TAG, "Failed to read value.", error.toException());
    }
};
database.getReference().child("med").addValueEventListener(medListener);

// 在onDestroy中移除监听器
@Override
protected void onDestroy() {
    super.onDestroy();
    if (medListener != null) {
        database.getReference().child("med").removeEventListener(medListener);
    }
}

4. 网络连接异常

若设备无网络,Firebase无法拉取数据,onDataChange自然不会触发。可检查设备网络状态,或在Firebase控制台查看实时日志,确认是否有数据请求记录。


正确获取img数据的示例

当监听器正常触发后,需遍历med下的子节点来提取每个节点的img值:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    System.out.println("11111111");
    if (dataSnapshot.exists()) {
        for (DataSnapshot medSnap : dataSnapshot.getChildren()) {
            String imgPath = medSnap.child("img").getValue(String.class);
            if (imgPath != null) {
                System.out.println("获取到img数据:" + imgPath);
                // 此处可处理img数据,比如加载图片
            }
        }
    } else {
        System.out.println("med节点下无数据");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:45:33