火箱Java固定器和嵌套Pojos的Getters



当我拥有某些原始字段和另一个是我创建的对象的POJO时,我应该添加哪些firebase的设置/获取器?

类似这样的东西

class Run :
    long time
    long date
    Distance distance
class Distance :
    double distanceKm

Run将是我添加到数据库的类。

如果我为timedatedistance添加了设置和GETTER,然后在Run上添加distanceKm,则如下:

public double getDistanceKm(){
    return distance.getDistanceKm();
}
public void setDistanceKm(double x){
    distance.setDistanceKm(x);
}

启动该应用时,我会出现无效的指针崩溃,因为firebase呼叫这些方法而不首先调用 setDistance(),所以距离是空的,它崩溃了。

如果我删除了这些getters和setter,并通过执行getDistance().getDistanceKm()来命中 distanceKm,但它静静地输出了数十个这样的警告:

W/ClassMapper: No setter/field for distanceKilometres found on class com.example.tobias.run.data.Run (fields/setters are case sensitive!)

如果有帮助,这是运行类的相关部分:

public class Run {
private Distance distance;
private long time;
private long date;
private int rating;
private long milePace;
private long kilometrePace;
private String id = null;
public Run(Distance distance, long time, long date, int rating) {
    this.distance = distance;
    this.time = time;
    this.date = date;
    this.rating = rating;
    this.kilometrePace = calculatePace(this.distance.getDistanceKm(), time);
    this.milePace = calculatePace(this.distance.getDistanceMi(), time);
}
@Deprecated
/**
 * This no-arg constructor is required and should only be used by firebase, never by a user,
 * because it will lead to the object being in an invalid state where no fields are initialized.
 */
public Run(){}
private long calculatePace(float distance, long time){
    //Period is inputted time in millis and converts it to hh:mm:ss
    Period period = new Period(time);
    float timeInSeconds = period.getHours() * 3600f + period.getMinutes() * 60f + period.getSeconds();
    float pace = timeInSeconds / distance;
    //Multiply pace by 1000 to convert it to millis from seconds.
    return (long) pace * 1000;
}

public float getDistanceKilometres(){
    return distance.getDistanceKm();
}
public float getDistanceMiles(){
    return distance.getDistanceMi();
}
public long getTime(){
    return time;
}
public long getDate(){
    return date;
}
public int getRating(){
    return rating;
}
public String getId(){ return id; }
public long getMilePace(){
    return milePace;
}
public long getKilometrePace() {
    return kilometrePace;
}
public Distance getDistance(){
    return distance;
}
public void setDistance(Distance distance){
    this.distance = distance;
    updatePace();
}
public void setTime(long time){
    this.time = time;
    updatePace();
}
public void setDate(long date){
    this.date = date;
}
public void setRating(int rating){
    this.rating = rating;
}
public void setId(String pushKey){
    id = pushKey;
}
@Deprecated
/**
 * Setter required for Firebase, should not be used by user as pace should never be set manually,
 * only computed off distance and time values, to avoid inconsistencies.
 */
public void setKilometrePace(long kmPace){
    this.kilometrePace = kmPace;
}
@Deprecated
/**
 * Setter required for Firebase, should not be used by user as pace should never be set manually,
 * only computed off distance and time values, to avoid inconsistencies.
 */
public void setMilePace(long milePace){
    this.milePace = milePace;
}

}

这是距离类的相关部分:

public class Distance {
private float distanceKm;
private float distanceMi;
public enum Unit {
    KM("km"), MILE("mi");
    private String value;
    Unit(String value){
        this.value = value;
    }

    @Override
    public String toString() {
        return value;
    }
}
public Distance(float distance, Unit unit){
    roundNearestTenth(distance);
    if (unit == Unit.MILE){
        distanceMi = distance;
        distanceKm = mileToKm(distance);
    } else  {
        distanceKm = distance;
        distanceMi = kmToMile(distance);
    }
}
@Deprecated
/**
 * This no-arg constructor is required and should only be used by firebase, never by a user,
 * because it will lead to the object being in an invalid state where no fields are initialized.
 */
public Distance(){}
public float getDistanceKm() {
    return distanceKm;
}
public float getDistanceMi() {
    return distanceMi;
}
public void setDistanceKm(float distanceKm) {
    distanceKm = roundNearestTenth(distanceKm);
    this.distanceKm = distanceKm;
    this.distanceMi = kmToMile(distanceKm);
}
public void setDistanceMi(float distanceMi) {
    distanceMi = roundNearestTenth(distanceMi);
    this.distanceMi = distanceMi;
    this.distanceKm = mileToKm(distanceMi);
}

}

和我的firebase控制台显示以下结构:

[pushKey]
    -date
    -id
    -kilometrePace
    -milePace
    -rating
    -time
    -distanceKm
    -distanceMi
    +distance
        -distanceKm
        -distanceMi

似乎是复制distanceKmdistanceMi字段的事实。它们应该仅在distance内吗?还是这种意图的行为?那我该怎么办才能删除该警告?

谢谢(:

您的代码是取决于称为setter的顺序,这不好。您的POJO应允许以任何顺序设置字段。正如您建议的那样,在跑步和距离之间重复可能不是一个好主意。通常,Pojo对象应该比包含结构化数据更重要,而不是取决于对象字段状态的逻辑。

最新更新