无法将Firebase数据迁移至PoIs类(无setter/字段警告)
解决Firebase数据解析时「类中不存在对应的setter/字段」警告
问题场景
尝试将Firebase数据库中的记录同步到本地SQLite,在读取Firebase数据并存储到ArrayList<PoIs>时,出现「类中不存在对应的setter/字段」警告。
现有代码
读取Firebase数据的代码
private List<PoIs> LocoList; LocoList = new ArrayList<>(); FirebaseApp.initializeApp(this); FirebaseAuth mAuth = FirebaseAuth.getInstance(); ref = FirebaseDatabase.getInstance().getReference("DATABASE"); ValueEventListener eventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { LocoList.clear(); if (dataSnapshot.exists()) { for (DataSnapshot ds : dataSnapshot.getChildren()) { PoIs loco = dataSnapshot.getValue(PoIs.class); LocoList.add(loco); } } } @Override public void onCancelled(DatabaseError databaseError) {} }; ref.addListenerForSingleValueEvent(eventListener);
PoIs实体类代码
public class PoIs { private Integer _location_id; private String _location_name; private String _location_address; private String _location_description; private String _location_county; public PoIs(){} public PoIs(Integer _location_id, String _location_name, String _location_address,String _location_description, String _location_county) { this._location_id = _location_id; this._location_name = _location_name; this._location_address = _location_address; this._location_description = _location_description; this._location_county = _location_county; } @PropertyName("_location_description") public String get_location_description() { return _location_description; } @PropertyName("_location_description") public void set_location_description(String _location_description) { this._location_description = _location_description; } }
Firebase数据结构
{ "DATABASE": { "PoI_100": { "_location_address": "Comuna Sâmbăta ", "_location_county": "BRASOV", "_location_description": "N/A", "_location_id": 100, "_location_name": "Mănăstirea Sâmbăta (Brâncoveanu)" }, "PoI_1000": { "_location_address": "Costinești ", "_location_county": "CONSTANTA", "_location_description": "N/A", "_location_id": 1000, "_location_name": "Teatrul de Vară" }, "PoI_1001": { "_location_address": "Olimp", "_location_county": "CONSTANTA", "_location_description": "N/A", "_location_id": 1001, "_location_image": "-", "_location_name": "Plaja Olimp" } } }
问题原因
- 循环解析对象错误:遍历
dataSnapshot.getChildren()时,错误使用父节点dataSnapshot解析数据,而非当前子节点ds,导致Firebase尝试将整个DATABASE节点映射到PoIs类,字段必然不匹配。 - 实体类字段不完整:
PoIs类仅为_location_description添加了getter/setter方法,其余字段(_location_id、_location_name等)无对应访问方法,Firebase无法完成数据映射。 - 存在额外字段:部分Firebase节点包含
_location_image字段,但PoIs类未定义该属性,触发警告。
解决步骤
1. 修正循环中的解析逻辑
将循环内的解析代码替换为使用当前子节点ds:
for (DataSnapshot ds : dataSnapshot.getChildren()) { PoIs loco = ds.getValue(PoIs.class); // 替换为当前子节点ds LocoList.add(loco); }
2. 补全实体类的getter/setter方法
为PoIs类所有字段添加完整的getter/setter,并配合@PropertyName注解确保与Firebase字段名一致:
import com.google.firebase.database.PropertyName; public class PoIs { private Integer _location_id; private String _location_name; private String _location_address; private String _location_description; private String _location_county; public PoIs() {} public PoIs(Integer _location_id, String _location_name, String _location_address, String _location_description, String _location_county) { this._location_id = _location_id; this._location_name = _location_name; this._location_address = _location_address; this._location_description = _location_description; this._location_county = _location_county; } @PropertyName("_location_id") public Integer get_location_id() { return _location_id; } @PropertyName("_location_id") public void set_location_id(Integer _location_id) { this._location_id = _location_id; } @PropertyName("_location_name") public String get_location_name() { return _location_name; } @PropertyName("_location_name") public void set_location_name(String _location_name) { this._location_name = _location_name; } @PropertyName("_location_address") public String get_location_address() { return _location_address; } @PropertyName("_location_address") public void set_location_address(String _location_address) { this._location_address = _location_address; } @PropertyName("_location_description") public String get_location_description() { return _location_description; } @PropertyName("_location_description") public void set_location_description(String _location_description) { this._location_description = _location_description; } @PropertyName("_location_county") public String get_location_county() { return _location_county; } @PropertyName("_location_county") public void set_location_county(String _location_county) { this._location_county = _location_county; } }
3. 处理Firebase中的额外字段
如果不需要_location_image字段,在PoIs类上添加@IgnoreExtraProperties注解,让Firebase忽略未定义的字段:
import com.google.firebase.database.IgnoreExtraProperties; import com.google.firebase.database.PropertyName; @IgnoreExtraProperties // 添加该注解 public class PoIs { // ... 其余代码不变 }
如果需要该字段,直接在PoIs类中添加对应的属性和getter/setter即可。
验证
完成以上修改后,重新运行代码,「类中不存在对应的setter/字段」警告会消失,Firebase数据可正常映射到PoIs对象并添加到ArrayList中。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

