Firestore无法从文档中获取部分字段问题求助
从你给出的错误信息来看,Firestore无法在ModelProgramas类中找到sabado字段对应的setter方法或成员变量,同时注意到类的包路径有重复(com.example.denilsondasilva.iasdmt.com.example.denilsondasilva.com.example.denilsondasilva.MODELS.ModelProgramas),这大概率是导致字段映射失败的主要原因之一。下面给你一步步的解决方案:
1. 修正模型类的包路径
错误提示里的包路径明显重复冗余,这会导致Firestore反射时找不到正确的类定义。请检查你的ModelPrograma类的包声明,确保它是简洁正确的,比如:
package com.example.denilsondasilva.MODELS; // 去掉重复的包名部分
2. 确保字段名与Firestore文档完全匹配
Firestore的字段映射是大小写敏感的,要保证模型类里的字段名(或setter方法对应的字段名)和Firestore文档中的字段名完全一致。比如文档里是sabado,模型类里不能写成Sabado或者拼写错误的sabadoo。
3. 保证字段的可访问性或提供正确的Setter方法
Firestore通过反射访问模型类的字段,有两种可行方式:
- 直接将字段设为
public,这样Firestore可以直接赋值:public class ModelPrograma { public String sabado; // 其他字段... // 必须添加无参构造函数 public ModelPrograma() {} } - 如果字段是
private,则需要提供符合JavaBean规范的Setter方法(方法名以set开头,后面跟字段名首字母大写):public class ModelPrograma { private String sabado; // 其他字段... public ModelPrograma() {} // 无参构造必须有 public void setSabado(String sabado) { this.sabado = sabado; } // 可选:添加Getter方法方便后续读取 public String getSabado() { return sabado; } }
4. 必须提供无参构造函数
Firestore需要通过无参构造函数来实例化你的模型类对象,如果你在类中定义了带参数的构造函数,一定要显式添加无参构造,否则反射实例化会失败,进而导致字段映射异常。
5. (可选)使用@PropertyName注解处理字段名不一致
如果Firestore的字段名和你模型类的字段名无法直接匹配(比如Firestore用蛇形命名,模型类用驼峰),可以用@PropertyName注解强制指定映射关系:
import com.google.firebase.firestore.PropertyName; public class ModelPrograma { @PropertyName("sabado") // 对应Firestore里的"sabado"字段 private String saturday; public ModelPrograma() {} @PropertyName("sabado") public void setSaturday(String saturday) { this.saturday = saturday; } @PropertyName("sabado") public String getSaturday() { return saturday; } }
按照上面的步骤检查并修改后,Firestore应该就能正确映射sabado字段了。
内容的提问来源于stack exchange,提问作者Denilson Renato Alberto Manuel

