2017-10-05 142 views
0

我無法檢索嵌套在「聯盟」和「季節」中的數據。Firebase數據庫 - 無法檢索嵌套數據

在下面的數據庫中,我無法檢索2016/2017賽季積分和結果。

我能夠訪問未嵌套的數據,如電子郵件和用戶名沒有問題

"Users" : 
    "User1" : { 
     "Email" : "[email protected]", 
     "Last_login" : "5:15pm", 
     "Username" : "Test", 
     "Leagues" : { 
     "FootballLeague" : true, 
     "CricketLeague" : true 
     }, 
     "Season" : { 
     "2017" : { 
       "Points" : 5, 
       "Results" : 2 
       "newdata" : { 
        "randomdata1: data1", 
        "randomdata2: data2" 
          }, 
       } 
     "2018" : { 
       "Points" : 7, 
       "Results" : 2 
     } 
} 

下面的類是我用來存儲數據的對象是什麼:

public class Users { 

private String Username; 
private String Email; 
private String Last_login; 
private Map<String, Boolean> Leagues; 
private Map<String, thisSeason> Season; 

public Users() { 

} 

//All getters and setters for the strings. 

public Map<String, Boolean> get_joined_Leagues() { 
    return Leagues; 
} 

public void set_joined_Leagues(Map<String, Boolean> leagues) { 
    Leagues = leagues; 
} 


public Map<String, thisSeason> getSeason() { 
    return Season; 
} 

public void set_thisSeason(Map<String, thisSeason> season) { 
    Season = season; 
} 

public static class thisSeason { 
private int Points; 
private int Results; 
private Map <String, thisNewData> newdata; 

    public thisSeason() { 
    } 

    public int getthisSeason_results() { 
     return Results; 
    } 

    public void setthisSeason_results(int resultsin) { 
     Results = resultsin; 
    } 

    public int getthisSeason_points() { 
     return Points; 
    } 

    public void setSeason_points(int Pointsin) { 
     Points = Pointsin; 
    } 

    public Map<String, thisNewData> getNewData() { 
    return newdata; 
    } 

    public void set_thisNewData(Map<String, thisNewData> newdata_in) { 
    newdata= newdata_in; 
    } 

    public static class thisNewData { 
     private String randomdata1; 
     private String randomdata2; 

     //Getters and Setters 
     } 

這裏是我的Java類的一部分,我訪問數據庫:

List<Users> usersList= new ArrayList<Users>(); 
DatabaseReference fbDB = FirebaseDatabase.getInstance().getReference(); 

     fbDB.child("Users").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      if (dataSnapshot.exists()) { 

       for (DataSnapshot ds : dataSnapshot.getChildren()) { 
        Users C = ds.getValue(Users.class); 
        usersList.add(C); 

        System.out.println(C.getSeason().getthisSeason_points()); //ERROR occurs here - null object reference 

       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 


} 

我得到一個空對象再如上面的代碼所示。

此外,稍微注意一點 - 我知道我的獲取聯盟的實施是不正確的。我如何檢索密鑰?

+0

通常我的onDataChange方法中,我使用 串串= datasnapshot.getValue(String.class); Textview.setText(string); 來獲取數據。 –

回答

0

,我在你的代碼中發現的主要問題:

首先,你Leagues對象: 嗯,這不應該是一個自定義對象所有,如果停留在目前的結構,但MapThis是地圖對象 - 具有keyvalue的集合,就像Realtime Database中的孩子一樣。

如果一個聯盟名稱(=鍵)沒有一個true(=值)旁邊 - 的名字可能已存儲在String變量,但這種情況並非如此,因爲在Realtime Database必須每一個孩子具有價值,並在聯賽名稱旁邊存儲「虛擬」值使每個聯盟成爲Map的一部分。這個當前的「虛擬」是boolean,這就是爲什麼這將是聯賽的數據類型:Map<String, Boolean> leagues


其次,你的Season對象: 你是一個賽季,很多季節之間的混淆。你的孩子 - 「季節」實際上儲存了很多季節。這就是爲什麼這種情況會類似於上面的情況 - 每個季節的時間是key,季節本身是value


因此,用戶類的變量應該是:

private String Username; 
private String Email; 
private String Last_login; 
private Map<String,Boolean> Leagues; 
private Map<String, Season> Seasons; 
+0

我按照上面的建議對User類進行了更改,但在嘗試訪問嵌套數據時仍然收到空對象引用錯誤。與我在代碼中評論爲「ERROR」的位置相同,我試圖像這樣訪問它。 – PSLDev

+0

請更新您的代碼和問題中的當前數據結構,這樣可以更容易地爲您提供幫助。 –

+0

我已經更新了我的JSON和代碼,以反映我現在擁有的。 – PSLDev