按照给定的标准更改Firebase数据库节点中的值 [英] Change values in Firebase database nodes by a given criteria

查看:108
本文介绍了按照给定的标准更改Firebase数据库节点中的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Firebase数据库实施了一些聊天应用。一切都安排好了现在我试图实现功能,用户名后用新的用户名更改他的所有消息。 Message结构如下所示:





I这个代码已经成功了:

pre $ private $ void changeCurrentUserMessagesUserName(final String newUserName){
mDatabase.child(RequestParameters.FB_CHILD_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(RequestParame (message.getMessageNodeKey())
.child(RequestParameters.FB_CHILD_MESSAGES_USERS)// messageUser
.setValue(newUserName);


$ b @Override
public void onCancelled(DatabaseError databaseError){
// do not
}
} );
}

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

解决方案

Andre提供的链接的要点是:通过使用一个多位置更新,您可以在一次通话中发送整个更新。在Java中使用相同的方法:

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

updates.put(
RequestParameters.FB_CHILD_MESSAGES +/+
message.getMessageNodeKey()+/+
RequestParameters.FB_CHILD_MESSAGES_USERS,
newUserName


mDatabase.updateChildren(updates);

$ b @Override
public void onCancelled(DatabaseError databas eError){
throw databaseError.toException();
}
});
}


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:

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?

解决方案

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

这篇关于按照给定的标准更改Firebase数据库节点中的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆