2017-12-03 10 views
0

現在、私はクラスA、B、Cのような少数の異なるクラスに対して、RowTypeというインターフェースを実装しています。Firebaseを使ってそれぞれのオブジェクトを取得する方法を教えてください。Firebaseとのインターフェイスの使用

.addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
         RowType rowType = snapshot.getValue(RowType.class); 
         Log.d("awdjk", "qwjel"); 
        } 

IはFirebaseに挿入されたすべてのオブジェクトは、私はスナップショット値を取得する行型を使用することができることを、いずれかのクラスA、B、またはCであるので、と仮定するであろう。しかし、「クラスRowTypeでシリアル化するプロパティが見つかりません」というエラーが表示されます。

UPDATE

インタフェース

public interface RowType { 
int EXERCISE_ROW = 0; 
int REST_ROW = 1; 
int SUPERSET_ROW = 2; 
int PYRAMIDSET_ROW = 3; 
int BUTTON_ROW = 4; 
} 

エクササイズクラス

public class ExerciseModel implements RowType { 
public String exercise, sets, reps, view, minutes, seconds, time, weight, childCount; 
private EditText weightEditText, setsEditText, repsEditText; 
private AutoCompleteTextView exerciseEditText; 
private ImageView dragHandle; 
private ExerciseRowTextWatcher exerciseRowTextWatcher; 


public ExerciseRowTextWatcher getExerciseRowTextWatcher(){ 
    return exerciseRowTextWatcher; 
} 

public void setExerciseRowTextWatcher(ExerciseRowTextWatcher exerciseRowTextWatcher){ 
    this.exerciseRowTextWatcher = exerciseRowTextWatcher; 
} 


public ImageView getDragHandle(){ 
    return dragHandle; 
} 

public void setDragHandle(ImageView dragHandle){ 
    this.dragHandle = dragHandle; 
} 

public AutoCompleteTextView getExerciseEditText(){ 
    return exerciseEditText; 
} 

public void setExerciseEditText(AutoCompleteTextView exerciseEditText){ 
    this.exerciseEditText = exerciseEditText; 
} 

public EditText getWeightEditText(){ 
    return weightEditText; 
} 

public void setWeightEditText(EditText weightEditText){ 
    this.weightEditText = weightEditText; 
} 

public EditText getSetsEditText(){ 
    return setsEditText; 
} 

public void setSetsEditText(EditText setsEditText){ 
    this.setsEditText = setsEditText; 
} 

public EditText getRepsEditText(){ 
    return repsEditText; 
} 

public void setRepsEditText(EditText repsEditText){ 
    this.repsEditText = repsEditText; 
} 

public String getChildCount(){ 
    return childCount; 
} 

public void setChildCount(String childCount){ 
    this.childCount = childCount; 
} 

public String getExercise(){ 
    return exercise; 
} 

public String getWeight(){ 
    return weight; 
} 

public String getSets(){ 
    return sets; 
} 

public String getReps(){ 
    return reps; 
} 

public String getView(){ 
    return view; 
} 

public String getMinutes(){ 
    return minutes; 
} 

public String getSeconds(){ 
    return seconds; 
} 

public String getTime(){ return time;} 

public void setExercise(String exercise){ 
    this.exercise = exercise; 
} 

public void setTime(String time){ this.time = time; } 

public void setWeight(String weight){ 
    this.weight = weight; 
} 

public void setMinutes(String minutes){ 
    this.minutes = minutes; 
} 

public void setSeconds(String seconds){ 
    this.seconds = seconds; 
} 

public void setSets(String sets){ 
    this.sets = sets; 
} 

public void setView(String view){ 
    this.view = view; 
} 

public void setReps(String reps){ 
    this.reps = reps; 
} 

} 

私はインターフェイスに実装されている他のクラスを持っていますが、この短いを維持するために、私は追加されましたエクササイズクラス。他のクラスは比較的類似している。

+0

このスレッドをチェックするhttps://stackoverflow.com/questions/37743661/firebase-no-properties-to-serialize-found-on-class –

+0

クラス/インターフェイスコードを追加してください。 –

+0

@AlexMamo私はコード –

答えて

0

モデルクラスとしてインターフェイスを使用することはできません。これは、モデルクラスがFirebaseに必要なpublic no-argument constructorを持つ必要があるため不可能です。わかっているように、インターフェイスはnewキーワードを使用して初期化できないため、コンストラクタを持つことはできません。

Firebaseに引数のないコンストラクタが必要なのはなぜですか? Firebase Realtime Database SDKがデータベースからのオブジェクトを逆シリアル化するとき、オブジェクトのインスタンス化に使用できるオブジェクトはすべてa public no-argument constructorである必要があります。これはSDKでは実際にそのインスタンスを作成します。

+0

を更新しました。スナップショットがクラス演習、または別のクラスであるかどうかを確認するにはどうすればいいですか? –

+0

snapshot.getValue()。getClass()。クラス名がオブジェクトのオブジェクトを挿入したにもかかわらず、getName()はHashMapを返します。 –

+0

Firebaseのすべてのノードが 'Map'なので、正しいです。間違った 'DatabaseReference'を指しているので、' Exercise'クラスの対応するオブジェクトを取得していません。 'Exercise'クラスがマッピングされている正確な場所にリスナーを付ける必要があります。私の答えがあなたを助けたと思いますか? –

関連する問題