按给定条件更改Firebase数据库节点中的值

时间:2016-12-20 07:56:09

标签: android firebase firebase-realtime-database

我使用Firebase数据库实现了某种聊天应用。一切都准备就绪。现在我正在尝试实现在用户名用新用户名更改所有消息后的功能。 Message结构如下所示:

enter image description here

我成功地使用了这段代码:

private void changeCurrentUserMessagesUserName(final String newUserName) {
    mDatabase.child(RequestParameters.FB_CHILD_MESSAGES) //messages
            .orderByChild(RequestParameters.FB_CHILD_USERS_UID) //messageUserUid
            .equalTo(mUser.getUid())
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot messageSnapshot : dataSnapshot.getChildren()) {
                        ChatMessage message = messageSnapshot.getValue(ChatMessage.class);

                        mDatabase.child(RequestParameters.FB_CHILD_MESSAGES) //messages
                                .child(message.getMessageNodeKey()) 
                                .child(RequestParameters.FB_CHILD_MESSAGES_USERS) //messageUser
                                .setValue(newUserName);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    //do nothing
                }
            });
}

但它闻起来,如果Firebase中有100条消息属于当前用户,则此代码将向Firebase发出100个请求以更改" messageUser"每个消息的节点。 任何人都可以帮助如何只提出一个请求?

1 个答案:

答案 0 :(得分:3)

Andre提供的链接有它的要点:通过使用单个multi-location update,您可以在一次通话中发送整个更新。这与Java中的方法相同:

mDatabase
  .child(RequestParameters.FB_CHILD_MESSAGES) //messages
  .orderByChild(RequestParameters.FB_CHILD_USERS_UID) 
  .equalTo(mUser.getUid())
  .addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
      Map<String,Object> updates = new HashMap<String,Object>();
      for (DataSnapshot messageSnapshot : dataSnapshot.getChildren()) {
        ChatMessage message = messageSnapshot.getValue(ChatMessage.class);

        updates.put(
          RequestParameters.FB_CHILD_MESSAGES+"/"+
          message.getMessageNodeKey()+"/"+
          RequestParameters.FB_CHILD_MESSAGES_USERS,
          newUserName
        );
      }
      mDatabase.updateChildren(updates);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
      throw databaseError.toException();
    }
  });
}