2016-11-20 123 views
3

我試圖從Android應用程序的recyclerview中的Firebase中檢索數據。我所引用的「boardz」節點上的對象有2個子屬性。這些屬性每個都有多個子屬性。將Firebase存儲的「陣列」對象轉換爲POJO

更新了火力地堡JSON和POJO:

{ 
"game" : { 
"boardz" : { 
    "-KTaL6V06e3SkEAvfU_3" : { 
    "hostData" : { 
     "hostId" : "MUC6gtRqInRQmqxe7khlmrAbjVZ2", 
     "ownerAddress" : "n3b9t3vDR6Yiot4HwxwZoa7vxZBiAKReeH", 
     "secretString" : "derp-a-derp" 
    }, 
    "metadata" : { 
     "across" : [ 2, 0, 5, 9, 7, 8, 1, 4, 3, 6 ], 
     "awayTeam" : "ATL", 
     "boardFeeBTC" : "", 
     "boardFeeUSD" : 14, 
     "collectionAddress" : "2NEPnGPyvy9F5N4W4CjhLNPZLwTFNSAzjAL", 
     "down" : [ 1, 6, 8, 7, 3, 5, 2, 0, 9, 4 ], 
     "endTime" : "2016-10-09T22:09:39.807Z", 
     "homeTeam" : "DEN", 
     "q1AwayScore" : "", 
     "q1HomeScore" : "", 
     "q1WinnerAddress" : "", 
     "q2AwayScore" : "", 
     "q2HomeScore" : "", 
     "q2WinnerAddress" : "", 
     "q3AwayScore" : "", 
     "q3HomeScore" : "", 
     "q3WinnerAddress" : "", 
     "q4AwayScore" : "", 
     "q4HomeScore" : "", 
     "q4WinnerAddress" : "", 
     "startTime" : "2016-10-08T22:09:39.807Z", 
     "winnersPaid" : false 
    } 
    }, 
    "-KTaP0-GPSCwCDA8BUlt" : { 
    "hostData" : { 
     "hostId" : "MUC6gtRqInRQmqxe7khlmrAbjVZ2", 
     "ownerAddress" : "mtLF8hks46i9DbSK1tBpenYMDsHpTbnuwC", 
     "secretString" : "do-diddly-doo" 
    }, 
    "metadata" : { 
     "across" : [ 9, 1, 6, 8, 0, 2, 4, 7, 3, 5 ], 
     "awayTeam" : "BUF", 
     "boardFeeBTC" : "", 
     "boardFeeUSD" : 25, 
     "collectionAddress" : "2N5VgMfKwCtJaiT4CLVAMvMQUG6PTbreY4z", 
     "down" : [ 9, 2, 4, 3, 7, 0, 5, 6, 8, 1 ], 
     "endTime" : "2016-10-09T22:26:47.467Z", 
     "homeTeam" : "LA", 
     "q1AwayScore" : "", 
     "q1HomeScore" : "", 
     "q1WinnerAddress" : "", 
     "q2AwayScore" : "", 
     "q2HomeScore" : "", 
     "q2WinnerAddress" : "", 
     "q3AwayScore" : "", 
     "q3HomeScore" : "", 
     "q3WinnerAddress" : "", 
     "q4AwayScore" : "", 
     "q4HomeScore" : "", 
     "q4WinnerAddress" : "", 
     "startTime" : "2016-10-08T22:26:47.467Z", 
     "winnersPaid" : false 
    } 
    } 
}, 

我用這個答案 How to represent nested data in Firebase class 創建POJO檢索嵌套數據和類是部分工作。

我的問題是答案沒有解釋如何從數據庫中檢索數組數據。 (不是對象列表,只是帶有整數的普通數組數據),child2 pojo未使用來自firebase的數據填充。

hostData pojo已成功映射到firebase子節點。所有hostData的屬性都是字符串,所以我認爲這很容易匹配。

metaData有一個數組,因爲它是第一個屬性。

我知道firebase將數組存儲爲json對象,如解釋here所述。我需要將這些「數組」對象轉換爲java列表或ArrayList,因此metaData的pojo將被填充。

那麼如何將存儲在firebase節點中的數組數據表示爲pojo?

我添加了pojo來幫助看看我如何創建對象並映射屬性。也許我錯過了什麼。

public class Board { 

private HostData hostData;//this class maps to the firebase json 
private MetaData metaData;//this class isn't mapping to any of the json properties. 

public Board() { 
} 

public Board(HostData hostData, MetaData metaData) { 
    this.hostData = hostData; 
    this.metaData = metaData; 
} 

public HostData getHostData() { 
    return hostData; 
} 

public MetaData getMetaData() { 
    return metaData; 
} 
//the hostData class works fine 
public static class HostData { 

    private String hostId; 
    private String ownerAddress; 
    private String secretString; 

    public HostData() { 
    } 

    public HostData(String hostId, String ownerAddress, String secretString) { 
     this.hostId = hostId; 
     this.ownerAddress = ownerAddress; 
     this.secretString = secretString; 
    } 

    public String getHostId() { 
     return hostId; 
    } 

    public String getOwnerAddress() { 
     return ownerAddress; 
    } 

    public String getSecretString() { 
     return secretString; 
    } 
} 
//this class is giving me hell. Am I missing something? 
public static class MetaData { 

    private List<Long> across = new ArrayList<>(); 
    private String awayTeam; 
    private Double boardFeeBTC; 
    private Double boardFeeUSD; 
    private String collectionAddress; 
    private List<Long> down = new ArrayList<>(); 
    private String endTime; 
    private String homeTeam; 
    private Long q1AwayScore; 
    private Long q1HomeScore; 
    private String q1WinnerAddress; 
    private Long q2AwayScore; 
    private Long q2HomeScore; 
    private String q2WinnerAddress; 
    private Long q3AwayScore; 
    private Long q3HomeScore; 
    private String q3WinnerAddress; 
    private Long q4AwayScore; 
    private Long q4HomeScore; 
    private String q4WinnerAddress; 
    private String startTime; 
    private Boolean winnersPaid; 

    public MetaData() { 
    } 

    public MetaData(List<Long> across, String awayTeam, Double boardFeeBTC, Double boardFeeUSD, String collectionAddress, List<Long> down, String endTime, String homeTeam, Long q1AwayScore, Long q1HomeScore, String q1WinnerAddress, Long q2AwayScore, Long q2HomeScore, String q2WinnerAddress, Long q3AwayScore, Long q3HomeScore, String q3WinnerAddress, Long q4AwayScore, Long q4HomeScore, String q4WinnerAddress, String startTime, Boolean winnersPaid) { 
     this.across = across; 
     this.awayTeam = awayTeam; 
     this.boardFeeBTC = boardFeeBTC; 
     this.boardFeeUSD = boardFeeUSD; 
     this.collectionAddress = collectionAddress; 
     this.down = down; 
     this.endTime = endTime; 
     this.homeTeam = homeTeam; 
     this.q1AwayScore = q1AwayScore; 
     this.q1HomeScore = q1HomeScore; 
     this.q1WinnerAddress = q1WinnerAddress; 
     this.q2AwayScore = q2AwayScore; 
     this.q2HomeScore = q2HomeScore; 
     this.q2WinnerAddress = q2WinnerAddress; 
     this.q3AwayScore = q3AwayScore; 
     this.q3HomeScore = q3HomeScore; 
     this.q3WinnerAddress = q3WinnerAddress; 
     this.q4AwayScore = q4AwayScore; 
     this.q4HomeScore = q4HomeScore; 
     this.q4WinnerAddress = q4WinnerAddress; 
     this.startTime = startTime; 
     this.winnersPaid = winnersPaid; 
    } 

    public List<Long> getAcross() { 
     return across; 
    } 

    public String getAwayTeam() { 
     return awayTeam; 
    } 

    public Double getBoardFeeBTC() { 
     return boardFeeBTC; 
    } 

    public Double getBoardFeeUSD() { 
     return boardFeeUSD; 
    } 

    public String getCollectionAddress() { 
     return collectionAddress; 
    } 

    public List<Long> getDown() { 
     return down; 
    } 

    public String getEndTime() { 
     return endTime; 
    } 

    public String getHomeTeam() { 
     return homeTeam; 
    } 

    public Long getQ1AwayScore() { 
     return q1AwayScore; 
    } 

    public Long getQ1HomeScore() { 
     return q1HomeScore; 
    } 

    public String getQ1WinnerAddress() { 
     return q1WinnerAddress; 
    } 

    public Long getQ2AwayScore() { 
     return q2AwayScore; 
    } 

    public Long getQ2HomeScore() { 
     return q2HomeScore; 
    } 

    public String getQ2WinnerAddress() { 
     return q2WinnerAddress; 
    } 

    public Long getQ3AwayScore() { 
     return q3AwayScore; 
    } 

    public Long getQ3HomeScore() { 
     return q3HomeScore; 
    } 

    public String getQ3WinnerAddress() { 
     return q3WinnerAddress; 
    } 

    public Long getQ4AwayScore() { 
     return q4AwayScore; 
    } 

    public Long getQ4HomeScore() { 
     return q4HomeScore; 
    } 

    public String getQ4WinnerAddress() { 
     return q4WinnerAddress; 
    } 

    public String getStartTime() { 
     return startTime; 
    } 

    public Boolean getWinnersPaid() { 
     return winnersPaid; 
    } 
} 
} 
+0

你可以添加任何日誌嗎?此外,嘗試使用文字而不是包裝類。「across」是一個int ArrayList。也許你可以使用Gson來分別序列化和反序列化你的pojos到json,反之亦然。 – Rohan

回答

2

看起來像一個小型的錯字問題。數據庫中的密鑰應該與POJO類中的密鑰匹配(區分大小寫)。

public class Board { 
    private HostData hostData; 
    private MetaData metadata; // change to this 

    ... constructor, getter, setter 
} 

或本

public class Board { 
    public HostData hostData; 
    @PropertyName("metadata") 
    public MetaData metaData; // make sure the field is in public 

    ... constructor, getter, setter 
} 
+0

就是這樣。我不知道我是如何忽視這麼長時間的。 – kreshendo

+0

只是爲了確保這一點,類名不應該與firebase中的類名相同,所以如果其中一個是大寫的,另一個不正確,那麼它的罰款呢? @Wilik –

+1

@PeterHaddad是的,這對班級的名字很好,但不適合屬性:) – Wilik

3

進入設置 - >插件 - >瀏覽存儲庫 - >產品查詢RoboPOJOgenerator。並按照this文件。