在Firebase(Android)中同时更新多个节点中的多个字段

时间:2019-05-15 05:15:31

标签: java android firebase firebase-realtime-database

我正在尝试使用“地图”和“更新子项”更新不同节点中的多个字段,但是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);

3 个答案:

答案 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);

以某种方式无法将地图插入地图。这都必须是大地图的一部分。