【问题标题】:Change values in Firebase database nodes by a given criteria按给定条件更改 Firebase 数据库节点中的值
【发布时间】:2016-12-20 07:56:09
【问题描述】:

我使用 Firebase 数据库实现了某种聊天应用。一切都已设置并正常工作。现在我正在尝试实现在用户名用新用户名更改所有消息后的功能。消息结构如下所示:

我用这段代码成功了:

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”节点更改为每条消息。 任何人都可以帮助如何只提出一个请求?

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

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

【讨论】:

  • mDatabase.updateChildren(updates)方法是否必须在for循环中?
  • 不,这只是一个错字。谢谢你抓。固定的。 :-)
猜你喜欢
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 2018-06-02
  • 2019-04-08
  • 1970-01-01
  • 2018-07-12
相关资源
最近更新 更多