2017-06-22 87 views
1

假設我有數據類:火力地堡:檢索類的價值實現地圖<K, V>

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

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

運行此代碼後data.properties包含所有在給定的快照properties項下存在的數據。

出於某種原因,我想改變properties場的類型,我的自定義地圖的實現:

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

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

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

運行此代碼data.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

似乎你誤解了我的問題。我需要將我的自定義Map實現用於「屬性」。我想知道爲什麼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 /接受我的答案,所以我們可以將這個問題標記爲關閉。謝啦! –

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 {名= '名',屬性= {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類(序列化各個屬性/字段)而不是集合中的項。 –