2013-08-20 34 views
4

在火力地堡的文檔約lists,還有就是你創建一個Java對象,並通過setValue()這樣寫對象的火力地堡參考的例子:Firebase的setValue()如何用於Java中的對象?

private static class MyObject { 

    private String property1; 
    private int property2; 

    public MyObject(String value1, int value2) { 
     this.property1 = value1; 
     this.property2 = value2; 
    } 

    public String getFirstProperty() { 
     return property1; 
    } 

} 

private void populateList() { 
    Firebase ref = new Firebase("https://MyDemo.firebaseIO-demo.com/myObjects"); 
    ref.push().setValue(new MyObject("myString", "7")); 
} 

如何在內部這項工作,即當你沒有寫一個toString()方法等,什麼值將完全保存到Firebase參考中?更進一步,Firebase客戶端能夠從保存的值恢復舊對象嗎?怎麼樣?

是否有必要擁有private static類,以便Firebase可以讀取字段?

回答

5

的文檔解釋how this works

在這個位置給定值設置的數據。通過該方法的價值認可的本地類型對應JSON類型:

  • Boolean
  • Long
  • Double
  • Map<String, Object>
  • List<Object>

此外,你可以將你自己的類的實例設置到這個loc中通貨膨脹,只要符合下列限制:

  1. 的類必須有一個默認的構造函數,它沒有參數
  2. 類必須定義一個公共的getter爲要分配的屬性。沒有一個公共的getter屬性將被設置爲默認值,當一個實例進行反序列化

所以,你必須爲你要保存的所有屬性創建getter方法。在你的例子中,你的firstProperty屬性將被編寫,但由於你還沒有定義默認的構造函數,所以它不可能被讀取。

+0

謝謝,沒有看到!所以這可能使用反射,對嗎?你知道嗎,也許,爲什麼吸氣者是必要的?由於沒有setter,所以必須使用反射才能訪問這些字段,爲什麼不在沒有getters的情況下直接獲取值呢?如果不是,沒問題,因爲我必須接受這個問題,無論如何,我猜;) – caw

+0

JavaBeans屬性通常使用[內省](http://docs.oracle.com/javase/7/docs/api/java/beans /Introspector.html),但是,它確實在幕後使用了反射。 –

+1

更正:Firebase Java客戶端庫在幕後使用[Jackson 1.x](http://jackson.codehaus.org/),並且Jackson有[自己的introspector](http://jackson.codehaus.org/ 1.9.9/javadoc/org/codehaus/jackson/map/introspect/package-summary.html),與JavaBeans不同。 –