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

Firebase Realtime Database读取视频URL返回null问题求助

问题修复方案

问题根因

你遇到的问题主要来自以下三类常见错误:

  • Esercizio实体类字段与数据库字段不匹配:Firebase Realtime Database 序列化严格匹配字段名大小写,如果你数据库中的视频链接字段名是videoUri,而实体类中定义的是videoURI、或者get/set方法命名和字段名不对应,会导致反序列化时该字段赋值失败。
  • 重复反序列化生成多对象:你的代码中两次调用snapshot.getValue(Esercizio.class),两次生成的是完全独立的对象,调试时取到的值和赋值用的对象不是同一个,就会出现调试看到有值、变量赋值却为null的情况。
  • 类型不兼容:如果你实体类中videoURI字段定义为Uri类型,Firebase 默认无法直接将数据库中存储的字符串反序列化为Uri对象,也会导致取值为null。

修复步骤

  1. 修正实体类定义
    将Esercizio中对应视频链接的字段改为和数据库完全匹配的命名,同时用String类型存储,不要直接用Uri:
public class Esercizio {
    private String nome;
    // 字段名和数据库完全一致,大小写都要匹配,用String类型适配数据库存储的字符串格式
    private String videoURI;

    // get、set方法名也要和字段名对应
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getVideoURI() {
        return videoURI;
    }

    public void setVideoURI(String videoURI) {
        this.videoURI = videoURI;
    }

    // 构造方法按需调整
    public Esercizio(String videoURI, String nome) {
        this.videoURI = videoURI;
        this.nome = nome;
    }
}
  1. 优化数据读取代码,只做一次反序列化
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    listaEsercizi.clear();
    for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
        // 仅反序列化一次,复用同一个对象,避免多对象取值不一致
        Esercizio currentEsercizio = snapshot.getValue(Esercizio.class);
        if (currentEsercizio != null) {
            String nome = currentEsercizio.getNome();
            String video = currentEsercizio.getVideoURI();
            listaEsercizi.add(new Esercizio(video, nome));
        }
    }
}

如果后续需要用到Uri对象,再手动转换即可:Uri videoUri = Uri.parse(video);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:36:05