我正在尝试使用“地图”和“更新子项”更新不同节点中的多个字段,但是firebase正在删除相应节点中的数据并添加数据。我希望更新数据,并且以前的数据保持不变。有趣的是,该逻辑在更新同一节点中的2个字段时有效,但在引入多个节点时无效。请参见下面的代码。
我不是要创建新字段,而只是同时更新2个不同节点中的2个现有字段。每个节点都有10个我要保留的字段。
我是从viewholder.button内部(在回收器视图适配器中)调用此
String ref1 = "users/" + currentUserId;
String ref2 = "user_detail_profile/" + currentUserId;
HashMap<String, Object> updateFbDb1 = new HashMap<>();
updateFbDb1.put("name", "Albert Einstein");
updateFbDb1.put("score", 23);
HashMap<String, Object> updateFbDb2 = new HashMap<>();
updateFbDb2.put("claps", 55);
updateFbDb2.put("comments", 21);
HashMap<String, Object> updateFbDb3 = new HashMap<>();
updateFbDb3.put(ref1, updateFbDb1);
updateFbDb3.put(ref2, updateFbDb2);
fbDbRefRoot.updateChildren(updateFbDb3);
这是可行的,但我想一次完成,这样就可以完全或不附加成功的侦听器。
HashMap<String, Object> updateFbDb1 = new HashMap<>();
updateFbDb1.put("name", "Albert Einstein");
updateFbDb1.put("score", 23);
HashMap<String, Object> updateFbDb2 = new HashMap<>();
updateFbDb2.put("claps", 55);
updateFbDb2.put("comments", 21);
fbDbRefRoot.child("users").child(currentUserId).updateChildren(updateFbDb1);
fbDbRefRoot.child("user_detail_profile").child(currentUserId).updateChildren(updateFbDb2);
答案 0 :(得分:1)
我正在尝试使用“地图”和“更新子级”更新不同节点中的多个字段,但是firebase正在删除相应节点中的数据并添加数据。
在使用DatabaseReference的setValue(Object value)时会发生这种情况:
将此位置的数据设置为给定值。
前进,
我希望更新数据,并且以前的数据保持不变。
在这种情况下,您应该使用DatabaseReference的updateChildren(Map update),我看到您已经在代码中使用它了。
将特定的子键更新为指定的值。
走得更远
这是可行的,但我想一次完成,这样就可以完全或不附加成功的侦听器。
在这种情况下,您应该使用批处理操作,如我在后续帖子中的回答所述:
您现在可以向批处理操作添加完整的侦听器或成功的侦听器。还请注意,这是一个原子操作,这意味着所有操作都将成功执行,或者都不应用任何操作。
答案 1 :(得分:0)
嘿,您可以在向Firebase节点添加数据的同时使用push方法
这是创建实例的方式
private lateinit var database: DatabaseReference
// ...
database = FirebaseDatabase.getInstance().reference
这就是您简单地添加数据的方式
mDatabase.child("users").child(userId).child("username").setValue(name);
这就是您推送数据的方式
String key = mDatabase.child("posts").push().getKey();
Post post = new Post(userId, username, title, body);
Map<String, Object> postValues = post.toMap();
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/posts/" + key, postValues);
childUpdates.put("/user-posts/" + userId + "/" + key, postValues);
mDatabase.updateChildren(childUpdates);
如果您想更新特定的文件
这是链接
https://firebase.google.com/docs/database/android/read-and-write#update_specific_fields
答案 2 :(得分:0)
以下解决方案基于@Alex Mamos的建议正在起作用...
Map<String, Object> map = new HashMap<>();
map.put("/users/" + currentUserId + "/name/", "Albert Einstein");
map.put("/users/" + currentUserId + "/score/", 23);
map.put("/user_detail_profile/" + currentUserId + "/claps/", 45);
map.put("/user_detail_profile/" + currentUserId + "/comments/", 8);
fbDbRefRoot.updateChildren(map);
以某种方式无法将地图插入地图。这都必须是大地图的一部分。