2017-12-20 14 views
1

firebase用のセッター/ゲッターは、いくつかのプリミティブフィールドと私が作成したオブジェクトである別のフィールドを持つpojoを追加すると追加する必要がありますか?このFirebase Javaのセッターとネストされたpojosを持つゲッター

class Run : 
    long time 
    long date 
    Distance distance 

class Distance : 
    double distanceKm 

Runよう

何かが、私は、データベースに追加しているクラスになります。

私はtime用セッターとゲッターを追加する場合は、datedistanceし、このようなRundistanceKm

public double getDistanceKm(){ 
    return distance.getDistanceKm(); 
} 

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

firebaseがsetDistance()を呼び出すことなく、これらのメソッドを呼び出すので、私はアプリを起動したとき、私はNULLポインタのクラッシュを取得まず、距離がゼロでクラッシュします。

私はそれらのゲッターとセッターを削除し、それが動作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の内部にあるだけでしょうか?その警告を取り除くために何をすべきですか?

おかげで(:あなたのコードは良くないセッターが呼ばれる順序に依存しているあなたのPOJOは、フィールドは、任意の順序で設定することが、あなたが示唆したように、ファイル名を指定して実行との間の重複を持つことができなければならない

+1

あなたはあなたの答えを編集してpojo全体を表示し、正確にあなたのデータベースにそのpojoにマップされているものの例を表示します。 –

+0

@DougStevenson updated – tatarusanu1

答えて

1

。一般的なルールとして、pojoオブジェクトはオブジェクトのフィールドの状態に依存するロジックではなく、構造化されたデータを含むより多くの部分を処理する必要があります。

+0

T答えはハンクス。 firebaseコンソールのフィールドの重複は意図されていますか? – tatarusanu1

+0

コンソールには、データベースに入力した内容のみが表示されます。だから私はあなたが何を意味するか分からない。 –

+0

データベースでは、なぜdistanceKmとdistanceMiはrunの内側でDistanceの内側にもありますか?距離だけではいけませんか? RunにdistanceKmまたはdistanceMiフィールドがないためです。 – tatarusanu1

関連する問題