我在删除和添加HashMap时遇到问题,我将其作为字段存储在Firebase对象中。
我首先添加一个密钥:{key1=true}
然后我在添加另一个密钥时删除密钥:{key1=true, key2=true}
- > {key2=true}
。
所以我期待最终结果只是key2
,但我得到的是空{}
。我理解它是如何发生但却无法理解如何解决这个问题。问题是我在回调中进行删除,这是在添加后发生的。
我是否只需要重构我的代码,以便在回调中不会发生删除?这听起来像是一个常见的问题,或者人们只是设计他们的代码架构比我更好?
答案 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状态同时更新的问题。