MeLean
MeLean

Reputation: 3441

Change values in Firebase database nodes by a given criteria

I implemented some kind of chat app using Firebase database. Everything is set and working. Now I am trying to implement functionality that after user name changes all his messages with new username. The Message structure looks like this:

enter image description here

I had success whit this code:

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
                }
            });
}

But it smells, if there are 100 messages in Firebase that belongs to current user this code will make 100 request to Firebase to change "messageUser" node to every single message. Anyone could help how to make just one request that?

Upvotes: 2

Views: 1327

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 599581

The link Andre provided has the gist of it: by using a single multi-location update, you can send the entire update in one call. Here's the same approach in 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();
    }
  });
}

Upvotes: 3

Related Questions