Firebase Realtime Database读取视频URL返回null问题求助
问题修复方案
问题根因
你遇到的问题主要来自以下三类常见错误:
Esercizio实体类字段与数据库字段不匹配:Firebase Realtime Database 序列化严格匹配字段名大小写,如果你数据库中的视频链接字段名是videoUri,而实体类中定义的是videoURI、或者get/set方法命名和字段名不对应,会导致反序列化时该字段赋值失败。- 重复反序列化生成多对象:你的代码中两次调用
snapshot.getValue(Esercizio.class),两次生成的是完全独立的对象,调试时取到的值和赋值用的对象不是同一个,就会出现调试看到有值、变量赋值却为null的情况。 - 类型不兼容:如果你实体类中
videoURI字段定义为Uri类型,Firebase 默认无法直接将数据库中存储的字符串反序列化为Uri对象,也会导致取值为null。
修复步骤
- 修正实体类定义
将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; } }
- 优化数据读取代码,只做一次反序列化
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
相关产品推荐
相关产品推荐

