2017-11-18 212 views
0

如何在下圖中更改我的孩子的節點名稱? questions_statsList<Integer>,我知道我得到整數作爲節點Id,因爲這是一個列表。我使用0到1000之間的數字隨機創建每個孩子。我將此ID設置爲對象的一部分,並找到它我循環顯示列表。我想要的是將「0671」設置爲創建對象的關鍵點。Firebase數據庫更改節點ID

我應該如何定義我的對象以便通過我定義爲字符串的Id訪問每個子對象。

每個questions_stats是一個對象。

這是我的UserProfile類定義。

public class UserProfile implements Parcelable { 
    private List<Integer> questions_list; 
    private List<QuestionsStats> questions_stats; 
    private String country_name, share_code, user_name; 
    private int token_count; 
    private Boolean is_guest; 

    public UserProfile() { 
    } 

    public UserProfile(List<Integer> questions_list, List<QuestionsStats> questions_stats, String country_name, String share_code, String user_name, int token_count, Boolean is_guest) { 
     this.questions_list = questions_list; 
     this.questions_stats = questions_stats; 
     this.country_name = country_name; 
     this.share_code = share_code; 
     this.user_name = user_name; 
     this.token_count = token_count; 
     this.is_guest = is_guest; 
    } 
} 

我知道我可以使用單獨的child("0159").setValue(QuestionStats)來設置它們。

但我的目的,我需要檢索「用戶」作爲一個整體的數據,然後遍歷whithin questions_stats像是一個列表。

我應該如何定義我的UserProfile類以實現我想要的功能?

有人可以給我一個提示嗎?

Sample

+0

你想要'0000'和'0001'裏面的數據嗎? –

+0

@Peter Haddad questions_stats是對象列表,因爲是列表0和1是索引。我想要的是能夠設置一個像「0001」或「8760」這樣的關鍵字來指定一個特定的對象,並以maps的形式訪問questions_stats而不是列表。我可以通過使用四個循環來訪問列表中的特定對象,但使用Map會使它更有效率,我相信。不知道如何實現地圖。 – Racu

+0

'Firebase'數據庫是一個NoSQL數據庫,它被構造成密鑰和veales對,這意味着數據庫中的每個節點都是'Map'。看到你的數據庫截圖,'question_stats'也是一個'Map',它具有'question_stats'作爲一個關鍵字和數據作爲一個值。 '0'節點也是一個映射,其中'0'作爲關鍵字,並將其下的數據作爲值。等等。不要混淆你在你的模型類中有一個列表。在數據庫內部,每個節點都是一個「Map」。 –

回答

0

也許我應該問如何「設置」,而不是「改變」節點ID 我所擁有的是一個List<QuestionsStats>,但使用List<QuestionsStats>你的索引作爲密鑰時,我想是有相同的List<QuestionsStats>而不是索引,我的每個項目的字符串鍵。 所以我改變了我的名單Map<String, QuestionsStats>。現在棘手的部分是當打包Object時。您可以使用​​writeMap()到包裹如本答案由@大衛瓦瑟here,但它給出了一個警告:

請使用writeBundle(束)來代替。在當前的dataPosition()處將Map映射到地塊 ,如果需要,則增大dataCapacity()。 Map鍵必須是String對象。映射值使用 writeValue(Object)編寫,並且必須遵循該規範。因爲Bundle類提供了一個類型安全的API,允許您在編組時使用 來避免神祕的類型錯誤,所以強烈建議使用writeBundle(Bundle)而不是 方法,因爲它是 。

與我瓜分使用此代碼,在 This Question意見的幫助

因此請注意,我要離開了「方便」的方式,以防有人評論發現它有用或有任何意見:

protected UserProfile(Parcel in) { 
//  in.readMap(myMap, Object.class.getClassLoader()); 
     myMap = new HashMap<>(); 
     String[] array = in.createStringArray(); 
     Bundle bundle = in.readBundle(Object.class.getClassLoader()); 
     for (String s : array) { 
      myMap.put(s, (Object) bundle.getParcelable(s)); 
     } 
    } 


    @Override 
    public void writeToParcel(Parcel dest, int flags) { 


    //  dest.writeMap(myMap); 
      Bundle bundle = new Bundle(); 
      for (Map.Entry<String, Object> entry : myMap.entrySet()) { 
       bundle.putParcelable(entry.getKey(), entry.getValue()); 
      } 
      Set<String> keySet = myMap.keySet(); 
      String[] array = keySet.toArray(new String[keySet.size()]); 
      dest.writeStringArray(array); 
      dest.writeBundle(bundle); 
     } 

爲什麼我想要這個,那麼目前我的清單中包含的項目少於100個,但它可能會增長到1000個,我不是Pro,但我相信如果我已經知道該項目的關鍵感興趣的人總是比不得不迭代列表來找到它更好。最後,我的主要問題是使用Map,我不知道如何。

0

How can I change the node names of my children in the image below?

答:有no way在其中您可以從您的火力地堡數據庫更改節點的名稱。沒有這樣做的API。你可以做的是在該節點上附加一個監聽器,並獲取dataSnapshot對象。有了這些數據,你可以使用其他名稱在另一個地方寫它。你不能簡單地重命名它們from 0 to 0000,1 to 0001等等。

+0

我相信有一種方法使用Map 來設置名稱。我只是不知道如何在我的模型中實現它。不想重命名,我想在更新我的「用戶」時設置密鑰(節點名稱)。 – Racu

+0

即使使用「Map 」,也不能簡單地更改節點的名稱。這不是關於你的模型,它是關於Firebase,它沒有提供任何允許你重命名節點的工具。當您想要設置密鑰(節點密鑰)時,這意味着您想要更新該密鑰,這在Firebase中是不可能的。你可以通過單一的方式來實現這一點,正如我上面所做的那樣。從當前位置獲取數據,使用其他名稱將其寫入另一個位置,從舊位置刪除記錄。 –

+0

不想重命名,因爲它的節點ID是一個索引,因爲questions_stats是一個List。我想要的是,我第一次創建一個名爲節點的名爲節點的字符串,以便稍後可以訪問它來修改它的內容。一旦我創建它,我不需要重命名它。 我檢索用戶作爲一個整體操縱其數據並更新它。我可以像For循環一樣工作,但我不相信它是有效的。 – Racu