2016-08-30 103 views
1

我試圖使用firebase push()函數,因爲我想添加一個列表關閉數據到一個已存在的列表。 setValue()函數覆蓋現有數據。推送數據到firebase不工作

這是我用來做:

DatabaseReference childref = mDatabase.child("users").child(uih.getUserData().getUsername()).child("answered_questions"); 
         childref.setValue(getAnsweredQuestions(questionViewList)); 

這個工作,但我每次使用此功能時的數據被覆蓋,這不是我想要的。我嘗試使用Firebase文檔中描述的推送功能:https://firebase.google.com/docs/database/android/save-data

我不確定我是否正確,但它不工作。這是當我試圖實現推送()函數:

DatabaseReference childref = mDatabase.child("users").child(uih.getUserData().getUsername()).child("answered_questions"); 
        String key = childref.push().getKey();  
        Map<String, Object> childUpdates = new HashMap<>(); 
        childUpdates.put(key, questionViewList); 
        mDatabase.updateChildren(childUpdates); 

我得到的例外是:

com.google.firebase.database.DatabaseException: Failed to parse node with class class scrambled.nl.generationr.QuestionView 

,這是奇怪的,因爲我在做的setValue沒有收到此錯誤方法。任何人都可以解釋我做錯了什麼,我應該如何將列表推入Firebase?

編輯:

什麼我可以做的是:

DatabaseReference childref = mDatabase.child("users").child(uih.getUserData().getUsername()).child("answered_questions"); 
          childref.push().setValue(getAnsweredQuestions(questionViewList)); 

在加推()在這裏。這是有效的,但不是隻增加我的列表,而是在列表中添加另一個圖層,以便實際獲得一個數組數組而不是更長的列表。

在這裏看到的結果:

enter image description here

+0

請提供您的數據庫結構的示例。根據我看到的代碼,每個用戶都有一個名爲「answers_questions」的子位置。您是否只是試圖向該用戶回答問題列表添加一個新答案的問題? –

+0

這確實正是我想要做的:每個用戶都有一個answers_question列表,我想添加一個List (Java對象)到這個列表 – Jasper

+1

好的...我應該可以幫助那個 –

回答

1

保存AnsweredQuestion對象的列表:

這裏假設你的設計時AnsweredQuestion.class使Java對象可以是你所遵循的規則用於在Firebase中存儲數據。如果您需要在「基本寫入操作」標題下爲檢查而在文檔中保存數據的指導。

//List of AnsweredQuestions 
List<AnsweredQuestion> mAllAnswers; 
.... 

//create the database reference that points to the correct parent node 
//where answeres are stored for each user  
DatabaseReference ref = mDatabase.child("users").child(uih.getUserData().getUsername()).child("answered_questions"); 

//Iterate over your List of AnsweredQuestion objects and use push() along with setValue() 
//to store a single AnsweredQuestion object to a unique location in your database. 
for(AnsweredQuestion answer : mAllAnswers){ 
    ref.push().setValue(answer); 
} 

檢索所有回答了用戶提出的問題:

//create List to store AnsweredQuestion object 
List<AnsweredQuestion> mAllAnswers = new ArrayList<AnsweredQuestion>(); 
... 

ref.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      //iterate over datasnapshot to get/store each AnsweredQuestion object 
      if(datSnapshot.exists()){ 
       for(DataSnapshot snapshot : dataSnapshot.getChildren()){ 
        AnsweredQuestion answer = snapshot.getValue(AnsweredQuestion.class); 
        mAllAnswers.add(answer); 
       } 
      } 
     } 

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

有多種方式來獲取每個用戶的答案,使用.addListenerForSingleValueEvent()只是一種方式。如果您想在ListViewRecyclerView中顯示答案,也可以使用FirebaseListAdapterFirebaseRecyclerAdapter