2017-06-22 18 views
1

私はデータのクラスを持っていると仮定し実装するクラスの値を取得する:このコードdata.propertiesを実行した後Firebase:地図<K, V>

class MyDataClass { 
    ... 
    public Map<String, Object> properties = HashMap() 
} 

// later 
MyDataClass data = snapshot.getValue(MyDataClass.class); 

は、与えられたスナップショットでpropertiesキーの下に存在するすべてのデータが含まれています。このコードdata.propertiesにはデータを実行していない後

class MyMap implements Map<String, Object> { ... } 

class MyDataClass { 
    ... 
    public MyMap properties = MyMap() 
} 

// later 
MyDataClass data = snapshot.getValue(MyDataClass.class); 

:私は私のカスタムマップの実装にpropertiesフィールドの種類を変更したい何らかの理由で

カスタムマップの実装にデータを取得することすらできますか?

UPD:JSON私は

{ 
    items: { 
    "id": { 
     "name": "name", 
     "properties": { 
     "simpleProp1": "value1", 
     "simpleProp2": "value2", 
     "simpleProp3": "value3", 
     "complexProp1": { 
      "subPop1": "subVal1" 
      ... 
     } 
     } 
    } 
    } 
} 

感謝を読み取ろう!

+0

なぜMyMapクラスを使用していますか?以下のようにMyDataClassを直接追加することができます。 'public class MyDataClass { public HashMap myData; public HashMap getMyData(){ return myData; } public void setMyData(HashMap myData){ this.myData = myData; } } – ashish

+0

あなたは私の質問を誤解しているようです。カスタムマップの実装を「プロパティ」に使用する必要があります。 Firebaseのsnapshot.getValue()メソッドでデータが設定されないのはなぜですか? – abond

+0

エラーが発生しますか? –

答えて

1

FirebaseはカスタムMapの実装を直接使用することはできません。そのように、あなたの代わりに、単純なデータクラスを追加することを検討可能性があります

class MyDataJSON { 
    public MyDataJSON() { } 
    public String name; 
    public Map<String, Object> properties; 
} 

class MyDataClass { 
    MyDataClass(MyDataJSON json) { ... } 
    ... 
} 

、あなたのMyDataClassオブジェクトを構築するためにそれを使用します。

MyDataJSON json = snapshot.getValue(MyDataJSON.class); 
MyDataClass data = MyDataClass(json); 

私は、これまで完璧から、知っているが、少なくとも、あなたは完全に制御しますデータベースアンマーシャリングプロセス(および対応するプロパティタイプ)。

+0

Pauloありがとうございました!私は今、同様のアプローチを使用しています。 – abond

+0

@abond Nice;)私はこの質問を閉じたものとしてマークすることができるので、私の答えをupvote/acceptするのを忘れないでください。ありがとう! –

0

このコードは、私のために働くようだ:

public static class MyDataClass { 
    public String name; 
    public Map<String,Object> properties = new HashMap<String,Object>(); 

    @Override 
    public String toString() { 
     return "MyDataClass{" + 
       "name='" + name + '\'' + 
       ", properties=" + properties + 
       '}'; 
    } 
} 

そして:

ref.addListenerForSingleValueEvent(
      new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        MyDataClass data = dataSnapshot.getValue(MyDataClass.class); 
        System.out.println(data); 
       } 

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

プリント:

MyDataClassの{nameは= '名前'、プロパティ= {simpleProp2 = value2、simpleProp1 = value1、complexProp1 = {subPop1 = subVal1}、simpleProp3 = value3}}

+0

私は彼のカスタム 'Map'実装を' properties'フィールド(つまり、彼の 'MyMap'クラス)に代わりたいと思っています。 –

+0

ありがとうフランク!このコードは私のためにも機能します。しかし、私が望むのは、新しいHashMap ()を置き換えることです。マップの私の独自の実装とインターフェイス。テスト目的のために、すべてのメソッド呼び出しをプライベートHashMapプロパティに委譲するだけで、Mapインターフェイスを実装するクラスを作成できます。 – abond

+0

遅れて申し訳ありません。これは、[SDKコード](https://github.com/firebase/firebase-admin-java)を掘り下げたものです。カスタムMapクラスは機能しません。その場合の非直列化はコレクションであることを認識せず、コレクション内のアイテムの代わりにBeanクラス(個々のプロパティ/フィールドをシリアライズする)として扱います。 –