2017-08-01 6 views
1

これはいくつかの形式で以前に尋ねられたことを知っているので、私は謝罪しますが、私が見つけたすべての回答は、オブジェクトのリストではなく、単一のオブジェクトであると思われます。FirebaseデータをJavaオブジェクトに変換するにはどうすればよいですか?

私はAndroid Studioを使用しており、データベースのFirebaseに接続しています。次のように私は、私自身のChartColourオブジェクトが私のアプリで定義されています。データベースで

public class ChartColour { 
    private String key, name, description; 
    private int alpha, red, green, blue; 

    public ChartColour(String thisKey) { 
     this.key = thisKey; 
    } 

public ChartColour(String thisKey, String thisName, int thisAlpha, int thisRed, int thisGreen, int thisBlue) { 
     this.key = thisKey; 
     this.alpha = thisAlpha; 
     this.red = thisRed; 
     this.green = thisGreen; 
     this.blue = thisBlue; 
     this.description = null; 
    } 

    @Exclude 
    public Map<String, Object> toMap() { 
     HashMap<String, Object> result = new HashMap<>(); 
     result.put("key", key); 
     result.put("name", name); 
     result.put("description", description); 
     result.put("a", alpha); 
     result.put("r", red); 
     result.put("g", green); 
     result.put("b", blue); 

     return result; 
    } 

} 

、サンプルレコードは、このようなものです:

colours 
-- 5ha8hkwe253 (unique key for this chart) 
    -- a:0 
    -- b:255 
    -- description: "Base colour" 
    -- g:255 
    -- name: "Base" 
    -- r: 255 

だから、私はこれを取得して設定するのですかChartColour、キーを知っていれば?これまでのところ、私は私のColourChart.javaクラスで定義され、この機能を持っている:

private void retrieveColourFromDatabase() { 

    DatabaseReference mColourReference = FirebaseDatabase.getInstance().getReference() 
     .child("colours").child(this.key); 

    mColourReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) { 
       ChartColour colour = userSnapshot.getValue(ChartColour.class); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
} 

しかし、それは右、「色」変数にそれをすべて設定しますか?しかし、私はそれが "this"を介してアクセス可能であることを望んでいます。しかし、もし私がそうするなら、forループの中で

this = userSnapshot.getValue(ChartColour.class); 

は、 'this'をValueEventListenerとして受け取り、ChartColourを取りません。私はこれが本当にシンプルだろうと知っていますが、私はそれだけで頭を上げることはできません。私は自分自身を混乱させてしまったように丸々と回ってきたと思います!私はJavaに比較的新しく、これは役に立たない。

ありがとうございました!

答えて

1

ChartColourは、データをクラスにマーシャリングするための要件を満たしていません。クラスが引数をとらないデフォルトコンストラクタを持っている必要があります

  1. :あなたのクラスには、これらの2つの性質を満たさなければなりません。
  2. クラスでは、プロパティを割り当てるためのパブリックゲッターを定義する必要があります。パブリック・ゲッターのないプロパティーは、インスタンスがデシリアライズされるときにデフォルト値に設定されます。要するに

、あなたのクラスとあなたの非デフォルトコンストラクタの各パラメータごとゲッターにpublic ChartColour() {};を追加します。そして、それはあなたの外側のクラスであると仮定すると、あなたがthisを使用したい場合は、ChartColour.thisに変更し

ChartColour colour = userSnapshot.getValue(ChartColour.class); 

を呼び出します。

+0

ありがとうございました!私はもともとデフォルトのコンストラクタを持っていましたが、何とかすべてを落とそうとしている間に、それを削除しました! getterなども追加します。あなたの助けをもう一度ありがとう。 – Sharon

関連する問題