2016-12-20 2 views
2

Я реализовал какое-то приложение для чата с использованием базы данных Firebase. Все настроено и работает. Теперь я пытаюсь реализовать функциональность, которая после того, как имя пользователя изменит все его сообщения с новым именем пользователя. Структура сообщений выглядит следующим образом:Изменение значений в узлах базы данных Firebase по заданным критериям

enter image description here

Я имел успех WHIT этот код:

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

Но воняет, если есть 100 сообщений в Firebase, который принадлежит текущему пользователю этот код будет сделать 100 для Firebase, чтобы изменить узел messageUser на каждое сообщение. Кто-нибудь может помочь, как сделать только один запрос?

+2

Взгляните на метод [этот ответ] (http://stackoverflow.com/a/17438028/4916627) –

ответ

3

Ссылка, предоставленная Андре, имеет смысл: с помощью одного 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(); 
    } 
    }); 
} 
+0

нужно ли mDatabase.updateChildren (обновления), чтобы быть в цикл for? – MeLine

+0

Нет, это просто опечатка. Спасибо, что поймали. Исправлена. :-) –

Смежные вопросы