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

无法将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"
    }
  }
}

问题原因

  1. 循环解析对象错误:遍历dataSnapshot.getChildren()时,错误使用父节点dataSnapshot解析数据,而非当前子节点ds,导致Firebase尝试将整个DATABASE节点映射到PoIs类,字段必然不匹配。
  2. 实体类字段不完整:PoIs类仅为_location_description添加了getter/setter方法,其余字段(_location_id、_location_name等)无对应访问方法,Firebase无法完成数据映射。
  3. 存在额外字段:部分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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:05:27