使用Firebase从HashMap添加/删除的并发问题

时间:2016-02-11 08:39:54

标签: firebase firebase-realtime-database

我在删除和添加HashMap时遇到问题,我将其作为字段存储在Firebase对象中。

我首先添加一个密钥:{key1=true}

然后我在添加另一个密钥时删除密钥:{key1=true, key2=true} - > {key2=true}

所以我期待最终结果只是key2,但我得到的是空{}。我理解它是如何发生但却无法理解如何解决这个问题。问题是我在回调中进行删除,这是在添加后发生的。

我是否只需要重构我的代码,以便在回调中不会发生删除?这听起来像是一个常见的问题,或者人们只是设计他们的代码架构比我更好?

1 个答案:

答案 0 :(得分:0)

为了后人的缘故 - 我真的很喜欢HashMap的便利性,但HashMap存在并发问题(设置整个hashmap会覆盖您可能同时设置的任何其他值)。

当我去updateChildren()时,我错误地设置了整个HashMap所以我写了一个简单的包装器来处理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状态同时更新的问题。