无法从Firebase快照提取数据,调用getTituloFilme返回null是什么原因
问题原因
Firebase Realtime Database 对快照数据和自定义类做映射时,默认要求类的字段名、Getter/Setter 命名和数据库中的键名严格匹配,你当前的命名存在两处不匹配:
- 数据库中电影名称的键为
Titulo,但Filme类中对应的字段名为tituloFilme,二者名称完全不对应 - 剩下两个字段的首字母大小写不匹配:数据库键为
Genero/Ano,类中字段为genero/ano
你之前直接调用setValue修改数据能成功,是因为你手动指定了数据库键名Titulo,没有走类到数据库的序列化映射逻辑,所以不受命名不匹配的影响。
解决方法
方案1:修改类命名和数据库完全对齐
直接调整Filme类的字段、Getter/Setter命名和数据库键完全一致即可:
public class Filme { private String Titulo; private String Genero; private String Ano; public Filme(){ } public Filme(String Titulo, String Genero, String Ano){ this.Titulo = Titulo; this.Genero = Genero; this.Ano = Ano; } public String getTitulo() { return Titulo; } public void setTitulo(String Titulo) { this.Titulo = Titulo; } public String getGenero() { return Genero; } public void setGenero(String Genero) { this.Genero = Genero; } public String getAno() { return Ano; } public void setAno(String Ano) { this.Ano = Ano; } }
方案2:使用@PropertyName注解指定映射关系
如果不想修改现有类的命名规范,可以给字段添加Firebase提供的@PropertyName注解,手动指定每个字段对应的数据库键:
import com.google.firebase.database.PropertyName; public class Filme { @PropertyName("Titulo") private String tituloFilme; @PropertyName("Genero") private String genero; @PropertyName("Ano") private String ano; // 原有构造方法、Getter、Setter无需修改 public Filme(){ } public Filme(String tituloFilme, String genero, String ano){ this.tituloFilme = tituloFilme; this.genero = genero; this.ano = ano; } public String getTituloFilme() { return tituloFilme; } public void setTituloFilme(String tituloFilme) { this.tituloFilme = tituloFilme; } public String getGenero() { return genero; } public void setGenero(String genero) { this.genero = genero; } public String getAno() { return ano; } public void setAno(String ano) { this.ano = ano; } }
内容的提问来源于stack exchange,提问作者user16469617
相关产品推荐
相关产品推荐

