2017-05-29 45 views
0

我在使用Firebase數據庫時將DataSnapshot投射到我的Model類時出現問題。將Firebase,DataSnapshot轉換爲Model類

我收到信息作爲DataSnapshot,並且當我將它設置爲toString()並記錄它時,我在數據庫中看到正確的信息(值)。但是,當我嘗試將其轉換爲我的模型類我看到我的默認(零個值)

  1. 參考

    E /查詢getRef():https://開頭****** ** /用戶/ pZl7xHxREefHZu3Zgd7ZZBSJTmA2 /活動

  2. DataSnapshot.toString()

    E /查詢DATAS:DataSnapshot {鍵=活動,值= {29May201720:11:16 = {,elapsedTime = 0,currentTime的= 170529201116,(...), myLocationsList = {(...)} //信息
    //在當前時刻鑄造

  3. 模型數據之後最後的數據

E /查詢GETVAL():ResourcesFromActivity {averageSpeed = 0.0,MAXSPEED = 0.0,averageStrokeRate = 0.0,totalMeters = 0} //歸零默認

  • 單個節點它的工作

    usersActivitiesRef = database.getReference( 「消息」); usersActivitiesRef.addValueEventListener(this);

  • 代碼:在的onCreate():

    (mAuth.getCurrentUser() == null) { 
         mAuth.getCurrentUser().reload(); 
        } 
        else{ 
         mUser = FirebaseAuth.getInstance().getCurrentUser(); 
         usersActivitiesRef = database.getReference("users").child(mUser.getUid()).child("activities");//.endAt(true).limitToLast(1); 
    
         // usersActivitiesRef = database.getReference("message"); 
         Query query = usersActivitiesRef.orderByChild("currentTime").limitToLast(1); 
         Log.e("Query getRef()",query.getRef().toString()); 
         //usersActivitiesRef.addValueEventListener(this); 
         query.addValueEventListener(this); 
        } 
    

    上的數據變化

    @Override 
    public void onDataChange(DataSnapshot dataSnapshot){ 
        ResourcesFromActivity receivedData = dataSnapshot.getValue(ResourcesFromActivity.class); 
        Log.e("Query Ref",dataSnapshot.getRef().toString()); 
        Log.e("Query DataS","\n "+dataSnapshot.toString()); 
        Log.e("Query getVal()","\n "+ receivedData.toString()); 
        Log.e("Query","\n "+ Long.toString(receivedData.getTotalMeters())); 
        allLocations = receivedData.getMyLocationsList(); 
        (...) 
    

    型號:

    @IgnoreExtraProperties 
    public class ResourcesFromActivity { 
    
    public String currentTime; 
    public long elapsedTime; 
    public String elapsedTimeStr; 
    public float averageSpeed; 
    public float maxSpeed; 
    public float averageStrokeRate; 
    public long totalMeters; 
    public List<MyLocation> myLocationsList = new ArrayList<>(); 
    public List<Location> allLocations = new ArrayList<>(); 
    public List<Float> allStrokes = new ArrayList<>(); 
    
    public ResourcesFromActivity(){ 
        // Default constructor required for calls to DataSnapshot.getValue(ResourcesFromActivity.class) 
    } 
    public ResourcesFromActivity(String currentTime, long elapsedTime, String elapsedTimeStr, float averageSpeed, float maxSpeed, float averageStrokeRate, long totalMeters, List<MyLocation> myLocationsList, List<Location> allLocations, List<Float> allStrokes) { 
        this.currentTime = currentTime; 
        this.elapsedTime = elapsedTime; 
        this.elapsedTimeStr = elapsedTimeStr; 
        this.averageSpeed = averageSpeed; 
        this.maxSpeed = maxSpeed; 
        this.averageStrokeRate = averageStrokeRate; 
        this.totalMeters = totalMeters; 
        this.myLocationsList = myLocationsList; 
        this.allLocations = allLocations; 
        this.allStrokes = allStrokes; 
    } 
    

    也許我做錯了什麼事與索引

    { 
        "rules": { 
        "users": { 
         "$uid": { 
         ".read": "true", 
         ".write": "$uid === auth.uid", 
         "$userId" :{ 
         "activities":{ 
         "$activitieId": { 
          ".read": "true", 
          ".indexOn": ["currentTime"] 
         } 
         } 
         } 
         }, 
    
    } 
    } 
    

    }

    謝謝

    +0

    我可以看到你的變量是私人的。你是否爲他們創建了getter和setter?你有一個公共構造函數將所有變量作爲參數嗎? –

    +0

    我修正了私有變量,但沒有更改,{我使用了alt + Insert並且默認是私有的,} –

    +0

    創建一個構造函數,將這些變量作爲參數。公衆獲得者和制定者。 –

    回答

    2

    它看起來像這裏的問題是什麼你得到回爲一個dataSnapshot VS輕微的不匹配你期望得到什麼。

    你在這種情況下返回的內容不是單個活動記錄,而是活動記錄的映射,在本例中包含一個項目(或一個子項),因爲這是您在查詢中指定的內容。

    所以這很重要,因爲即使地圖只包含一個項目,預期不匹配的字段也不能直接將此地圖設置爲ResourcesFromActivity類。您當前的設置要做到這一點

    一種方法是修改onDataChange像這樣:

    @Override 
    public void onDataChange(DataSnapshot dataSnapshot){ 
        for(DataSnapshot activitySnapShot: dataSnapshot.getChildren()){ 
         ResourcesFromActivity receivedData = activitySnapShot.getValue(ResourcesFromActivity.class); 
        } 
    } 
    

    在這裏,我們現在通過dataSnapshot的孩子迭代擺脫孩子們的活動數據。在這種情況下,它只有一個孩子,但你可以修改以處理多個孩子。

    +0

    是的你是對的,它現在工作,謝謝 –