2016-02-11 67 views
1

我在從Firebase對象中將字段存儲爲HashMap並將其添加到HashMap時出現問題。使用Firebase從HashMap中添加/刪除的併發問題

我開始加入一鍵:{key1=true}

然後我刪除鍵,同時加入另一個問題:{key1=true, key2=true} - >{key2=true}

所以我期待最終的結果只是key2但我得到的是空的{}。我瞭解它是如何發生的,但無法理解如何解決這個問題。問題是我正在執行刪除回調,這是在添加後發生的。

我是否必須重構我的代碼,以便刪除不會發生在回調中?這聽起來像是一個常見問題,或者人們只是比我更好地設計他們的代碼架構?

+0

而不是描述您的代碼,創建一個代碼重現問題的最小片段。我們這裏的大多數人閱讀代碼比文字更容易。請參閱http://stackoverflow.com/help/mcve –

回答

0

爲了後代的緣故 - 我真的很喜歡HashMap的便利性,但HashMap存在併發問題(設置整個hashmap覆蓋可能同時設置的任何其他值)。

我誤已設置整個HashMap的時候我就去updateChildren()所以我寫了一個簡單的包裝處理添加/在HashMap中刪除的條目:

protected void updateFirebase(String FIELD, HashMap<String, Boolean> hashMap, String hashKey) { 
    boolean found = false; 
    for (Object k : hashMap.keySet()) { 
     if (TextUtils.equals((String) k, hashKey)) { 
     found = true; 
     } 
    } 
    if (found) { // item being added 
     HashMap<String, Object> addItem = new HashMap<>(); 
     addItem.put(hashKey, hashMap.get(hashKey)); 
     new Firebase(getObjectUrl()).child(this.key).child(FIELD).updateChildren(
     addItem 
    ); 
    } else { // item being removed 
     new Firebase(getObjectUrl()).child(this.key).child(FIELD).child(hashKey).removeValue(); 
    } 
    } 

因此,這反而會更新條目而不是嘗試更新整個子樹 - 這消除了使用壞舊HashMap狀態同時更新的問題。