2017-10-05 86 views
2

我試圖將DataSnapshot值轉換爲對象。它的工作正常,我相信用於轉換的bean構造函數(帶參數)。我添加了一些代碼行來執行某些操作,但我添加的代碼行從未得到執行。樣品bean類:Firebase實時數據庫DataSnapshot值到對象轉換

@IgnoreExtraProperties 
public class DatabaseRecord { 

    private String firstName; 
    private String lastName; 
    private String fullName; 

    private DatabaseRecord() { 
    } 

    public DatabaseRecord(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     // following code not executing 
     this.fullName = firstName + lastName; 
    } 

    public String getFirstName() { return firstName; } 
    public String getLastName() { return lastName; } 
    public String getFullName() { return fullName; } 
} 

火力地堡在線數據庫流量: enter image description here

取數據執行代碼:

DatabaseReference databaseReference = database.getReference("/user/user1"); 
databaseReference.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     DatabaseRecord record = dataSnapshot.getValue(DatabaseRecord.class); 
     Log.d(TAG, record.getFirstName()+":"+record.getLastName()+":"+record.getFullName()); 
    } 

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

輸出:

薩蒂什:潘迪:空

  1. 谷歌文檔顯示參數化的構造函數來設置屬性,如果這是爲什麼不是我的代碼執行?

  2. 如何在Google轉換完成後在同一個bean對象中追加我的代碼?

回答

1

在你的情況下被調用構造函數是無參數的,因爲你是從使用getValue()數據庫,這是需要在該值映射閱讀DataSnapshot。根據該文檔,這些都是必須遵循的DataSnapshot數據進入一個自定義的Java類的規則:

  • 的類必須有一個默認的構造函數,它沒有參數

  • 類必須爲要分配的屬性定義公共getter。當一個實例被反序列化時,沒有公共getter的屬性將被設置爲它們的默認值。

我要設置fullName你能做到這一點在同一個getFullName()方法屬性的值。事情是這樣的:

public String getFullName() { 
    if(fullName == null){// it will be null the first time assuming the value doesn't exist in the database. 
     fullName = getFirstName() + getLastName(); 
    } 
    return fullName; 
} 
2

這裏

的火力地堡JSON解串器firebaser使用默認(無參數)構造函數,然後使用或者setter方法或公共字段設置的值。

大多數示例(以及我寫的大多數真實代碼)都會有一個用於定期創建對象的參數化構造函數,但該參數化構造函數不會被Firebase使用。

我很可能會令getFullName()的計算值:

public String getFullName() { return firstName + lastName; } 
+0

我重視私人的訪問修飾符屬性和默認的構造函數,並沒有在我的bean類的setter方法,但對於火力firstName和lastName填充值。 –

+0

如果沒有setter,Firebase會嘗試查找與JSON屬性匹配的字段並直接在該字段中設置值。 –

相關問題