setValue()在Model Activity中不生效,FirebaseDatabase无法写入数据问题
问题排查与解决步骤
- 修正存储类型错误:你当前直接将
Uri对象传入ProductDetails实体类存入数据库,Firebase Realtime Database不支持直接序列化Uri类型,需要将其转为字符串格式:
把构造ProductDetails的代码改为:
同步修改ProductDetails info = new ProductDetails(brand, name, categories, quantity, price, description, uri.toString(), RandomUID, BusinessId);ProductDetails类中对应图片地址字段的类型为String,并提供对应的get、set方法。- 修正存储类型错误:你当前直接将
- 补全数据库写入的错误日志:你目前仅监听了
setValue的onComplete回调,无法感知写入失败的原因,添加错误监听打印详细报错:
firebaseDatabase.getInstance().getReference("ProductDetails") .child(RandomUID) .setValue(info) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { progressDialog.dismiss(); if(task.isSuccessful()){ Toast.makeText(UploadAProduct.this,"Έτοιμή για σαλπάρισμα!",Toast.LENGTH_SHORT).show(); }else{ // 打印错误信息排查问题 Log.e("写入失败", task.getException().getMessage()); Toast.makeText(UploadAProduct.this,"写入失败:"+task.getException().getMessage(),Toast.LENGTH_SHORT).show(); } } });- 补全数据库写入的错误日志:你目前仅监听了
- 修正
FirebaseDatabase的调用方式:检查你的firebaseDatabase变量声明,getInstance()是FirebaseDatabase类的静态方法,应该用类名直接调用,而非实例变量调用,避免空指针或者实例错误:
将所有firebaseDatabase.getInstance()改为FirebaseDatabase.getInstance()(首字母大写,对应类名)。
- 修正
- 检查实体类规范:确保
ProductDetails类包含无参构造函数,所有需要序列化的字段都有public的getter方法,不要添加无关的序列化注解(除非明确配置)。
- 检查实体类规范:确保
- 检查混淆配置:如果你的项目开启了代码混淆,确保已经添加Firebase Realtime Database的混淆规则,避免实体类被混淆后无法正常序列化。
内容的提问来源于stack exchange,提问作者user15965834
相关产品推荐
相关产品推荐

