Firebase存储异常:使用dbref.push().setValue(storeInfo)无数据存入
问题解决思路
一、storeInfo无法存入Firebase的原因及解决
Firebase Realtime Database序列化自定义对象时,要求类满足以下核心条件:
- 必须包含无参构造函数(public权限或默认权限,供反射创建实例)
- 所有需要存储的字段为
public,或者提供对应的publicgetter方法
你的StoreInfo类大概率不符合上述要求,修改示例如下:
方案1:使用public字段
public class StoreInfo { // 字段必须为public public String data; public String date; public String time; // 必须添加无参构造函数 public StoreInfo() {} // 带参构造函数保留 public StoreInfo(String data, String date, String time) { this.data = data; this.date = date; this.time = time; } }
方案2:使用private字段+getter方法
public class StoreInfo { private String data; private String date; private String time; public StoreInfo() {} public StoreInfo(String data, String date, String time) { this.data = data; this.date = date; this.time = time; } // 必须提供public的getter方法 public String getData() { return data; } public String getDate() { return date; } public String getTime() { return time; } }
二、setValue(data)仅存1条数据的排查
dbref.push()会自动生成唯一子节点ID(如-Nxxxxxx),理论上每次调用都会新增数据而非覆盖。若出现仅存1条的情况,按以下步骤排查:
- 检查
dbref的初始化路径:确保dbref = FirebaseDatabase.getInstance().getReference("你的目标路径");,而非指向某个具体叶子节点 - 在
onComplete中添加错误日志,确认是否存储失败:
.addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { scanner.qrtext.setText("Course: " + data); scanner.date.setText("Date: " + date); scanner.arrival.setText("Arrival time: " + time); onBackPressed(); } else { // 打印错误日志定位问题 Log.e("FirebaseStore", "存储失败", task.getException()); } } });
内容的提问来源于stack exchange,提问作者michy
相关产品推荐
相关产品推荐

