Android Firebase数据库添加Activity对象仅部分字段写入问题求助
解决Firebase仅写入部分Activity字段的问题
这个问题我之前帮不少开发者排查过,核心原因是你没满足Firebase Realtime Database的Java对象序列化规则,咱们一步步来修正:
问题根源
Firebase在把Java对象序列化写入数据库时,有两个硬性要求:
- 必须提供无参数的构造函数:Firebase需要通过反射创建对象实例,没有无参构造的话,它没法完成这个基础步骤
- 所有要写入数据库的字段,要么是
public修饰的,要么有符合JavaBean规范的getter/setter方法:Firebase依赖这些方法来读取字段的值
看你的Activity类,既没有无参构造函数,而且如果getter/setter命名不规范或者缺失,Firebase就只能访问到它能正确读取值的字段(也就是你提到的activity_workout_user和user,大概率这两个的方法刚好符合规范)。
修正方案
修改你的Activity类,补充无参构造函数,并且给所有字段添加正确的getter/setter:
public class Activity { private String workout, user, exercise, duration, weight, reps, date, activity_workout_user; // 必须添加的无参构造函数,空实现即可 public Activity() {} // 保留你原来的带参构造函数 public Activity(String workout, String user, String exercise, String duration, String weight, String reps, String date) { this.workout = workout; this.user = user; this.exercise = exercise; this.duration = duration; this.weight = weight; this.reps = reps; this.date = date; this.activity_workout_user = exercise + "_" + workout + "_" + user; } // 所有字段的getter和setter,严格遵循JavaBean命名规范 public String getWorkout() { return workout; } public void setWorkout(String workout) { this.workout = workout; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getExercise() { return exercise; } public void setExercise(String exercise) { this.exercise = exercise; } public String getDuration() { return duration; } public void setDuration(String duration) { this.duration = duration; } public String getWeight() { return weight; } public void setWeight(String weight) { this.weight = weight; } public String getReps() { return reps; } public void setReps(String reps) { this.reps = reps; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getActivity_workout_user() { return activity_workout_user; } public void setActivity_workout_user(String activity_workout_user) { this.activity_workout_user = activity_workout_user; } }
额外小提示
我还注意到你在addActivity方法里创建Activity实例时,最后一个参数传的是页面创建时的timeCreated,但你明明定义了记录当前添加活动时间的activityDate。如果你的需求是记录活动被添加的日期,建议把这行代码改成:
Activity activity = new Activity(activityWorkout, activityUser, activityExercise, activityDuration, activityWeight, activityReps, activityDate);
完成这些修改后,所有字段应该都能正常写入Firebase数据库了。
内容的提问来源于stack exchange,提问作者DoubleU
相关产品推荐
相关产品推荐

