firebase用のセッター/ゲッターは、いくつかのプリミティブフィールドと私が作成したオブジェクトである別のフィールドを持つpojoを追加すると追加する必要がありますか?このFirebase Javaのセッターとネストされたpojosを持つゲッター
class Run :
long time
long date
Distance distance
class Distance :
double distanceKm
Run
よう
何かが、私は、データベースに追加しているクラスになります。
私はtime
用セッターとゲッターを追加する場合は、date
、distance
し、このようなRun
上distanceKm
:
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
は事実ですdistanceKm
とdistanceMi
のフィールドが重複しています。彼らはdistance
の内部にあるだけでしょうか?その警告を取り除くために何をすべきですか?
おかげで(:あなたのコードは良くないセッターが呼ばれる順序に依存しているあなたのPOJOは、フィールドは、任意の順序で設定することが、あなたが示唆したように、ファイル名を指定して実行との間の重複を持つことができなければならない
あなたはあなたの答えを編集してpojo全体を表示し、正確にあなたのデータベースにそのpojoにマップされているものの例を表示します。 –
@DougStevenson updated – tatarusanu1