2017-03-18 44 views
2

我在将自定义对象推送到Firebase时面临一个非常小的问题。我试图解释这个问题,所以帖子可以很长。我会尽力清理代码,以便只保留与问题相关的代码。请耐心一边看我的问题:)将自定义对象写入Firebase数据库

我想创建一个小时间表,然后当用户按Save Button,我推这个时间表到firebase。我创建了以下自定义对象,名为Schedule,它具有Alarm,它们分别具有AlarmTimingsAlarmDow对象。我认为通过下面的代码会更清楚。

Schedule.class

@IgnoreExtraProperties 
public class Schedule { 
    private String scheduleName; 
    private String description; 
    private Alarm alarm; 

    public Schedule() {} 

    public Schedule(String scheduleName, String description, Alarm alarm) { 
     this.scheduleName = scheduleName; 
     this.description = description; 
     this.alarm = alarm; 
    } 
    // Setters and Getters 
    @Exclude 
    public Map<String, Object> toMapSchedule() { 
     HashMap<String, Object> result = new HashMap<>(); 
     result.put("scheduleName", scheduleName); 
     result.put("description", description); 
     result.put("alarm", alarm); 
     return result; 
    } 

} 

上述类有报警对象。

@IgnoreExtraProperties 
public class Alarm { 
    private int date; 
    private int month; 
    private int year; 
    private AlarmTiming alarmTiming; 
    private AlarmDow alarmDow; 

    public Alarm() {} 

    public Alarm(int date, int month, int year, AlarmTiming alarmTiming, AlarmDow alarmDow) { 
     this.date = date; 
     this.month = month; 
     this.year = year; 
     this.alarmTiming = alarmTiming; 
     this.alarmDow = alarmDow; 
    } 
    //Setters and Getters 

    @Exclude 
    public Map<String, Object> toMapAlarm() { 
     HashMap<String, Object> result = new HashMap<>(); 
     result.put("date", date); 
     result.put("month", month); 
     result.put("year", year); 
     result.put("alarmTiming", alarmTiming); 
     result.put("alarmDow", alarmDow); 
     return result; 
    } 
} 

该报警类反过来必须对象AlarmTimings和AlarmDow。

@IgnoreExtraProperties 
public class AlarmDow { 
    private int sunday, monday, tuesday, wednesday, thursday, friday, saturday, alldays; 

    public AlarmDow() {} 

    public AlarmDow(int sunday, int monday, int tuesday, int wednesday, int thursday, int friday, int saturday, int alldays) { 
     this.sunday = sunday; 
     this.monday = monday; 
     this.tuesday = tuesday; 
     this.wednesday = wednesday; 
     this.thursday = thursday; 
     this.friday = friday; 
     this.saturday = saturday; 
     this.alldays = alldays; 
    } 
    //Setters and Getters 
    @Exclude 
    public Map<String, Object> toMapAlarmDow() { 
     HashMap<String, Object> result = new HashMap<>(); 
     result.put("sunday", sunday); 
     result.put("monday", monday); 
     result.put("tuesday", tuesday); 
     result.put("wednesday", wednesday); 
     result.put("thursday", thursday); 
     result.put("friday", friday); 
     result.put("saturday", saturday); 
     result.put("alldays", alldays); 
     return result; 
    } 
} 

@IgnoreExtraProperties 
public class AlarmTiming { 
    private int hour1; 
    private int minute1; 

    private int hour2; 
    private int minute2; 

    private int hour3; 
    private int minute3; 

    private int intervalHour; 

    public AlarmTiming() {} 

    public AlarmTiming(int hour1, int minute1, int hour2, int minute2, int hour3, int minute3, int intervalHour) { 
     this.hour1 = hour1; 
     this.minute1 = minute1; 
     this.hour2 = hour2; 
     this.minute2 = minute2; 
     this.hour3 = hour3; 
     this.minute3 = minute3; 
     this.intervalHour = intervalHour; 
    } 
    //Normal Setters and Getters 
    @Exclude 
    public Map<String, Object> toMapAlarmTiming() { 
     HashMap<String, Object> result = new HashMap<>(); 
     result.put("hour1", hour1); 
     result.put("minute1", minute1); 
     result.put("hour2", hour2); 
     result.put("minute2", minute2); 
     result.put("hour3", hour3); 
     result.put("minute3", minute3); 
     result.put("intervalHour", intervalHour); 
     return result; 
    } 
} 

问题: 我不停的构造函数的原因是因为在我的片段的onCreate()我可以将它们初始化为0的东西作为默认值,然后当用户选择的东西,而填补了计划对象获取属性设置。如下所示:

@Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     alarmDow=new AlarmDow(0,0,0,0,0,0,0,0); 
     alarmTiming= new AlarmTiming(0,0,0,0,0,0,0); 
     alarm= new Alarm(0,0,0,alarmTiming,alarmDow); 
     schedule= new Schedule("Null","Null",alarm); 
    } 

现在用户按下保存按钮后。我正在做这样的事情:

alarm.setAlarmTiming(alarmTiming); 
    alarm.setAlarmDow(alarmDow); 
    schedule.setAlarm(alarm); 
mRef.child("DailySchedules").child(taskNameEditText.getText().toString()) 
      .setValue(schedule); 

现在,当我按下保存时,它不会弹出任何错误。但它不起作用。没有任何内容发布到Firebase,我的应用也没有崩溃。任何建议:)

+0

使公共类中的变量变为public并将onCompleteListener添加到mRef,以便在返回时可以检查是否发生错误 –

+0

@Majeed Khan出于某种原因,通过放置这些监听器来工作,控制台未向我显示所有目前的数据,也包括我一直试图将这些数据放入Firebase的所有数据。 –

回答

2

为Java对象序列到火力地堡,他们应该:

  1. 行为像JavaBeans的。这意味着他们已经为要序列化的每个字段正确命名了公共getter和setter。

  2. 或者对所有要序列化的数据使用公共字段。

现在,您的对象只包含私有字段,并且没有获取者和设置者。这意味着Firebase无法正确内省您的课程来确定您想要序列化的字段。