【问题标题】:How to fetch a specific node data from multiple Nodes from Firebase to this Layout?如何从 Firebase 的多个节点中获取特定节点数据到此布局?
【发布时间】:2020-05-05 08:24:58
【问题描述】:

我成功地在应用的布局中加载了每个用户特定的 UID。这是图片:

在注册时,我还将用户的电子邮件和密码保存到“用户”节点下的数据库中。这是数据库截图:

可以清楚地看到,所有的消息都保存在“MessageTest”节点下,而用户名和电子邮件保存在“用户”节点下。

这是将姓名和电子邮件保存到数据库的模型类:

public class GetUserName {

String name,email;

public GetUserName(String name, String email) {
    this.name = name;
    this.email = email;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

这是我的 ChatModel 类:

    public class ChatModel {

    String messages;
   String username;
    public ChatModel() {
    }
    public ChatModel(String messages, String username) {
        this.messages = messages;
        this.username = username;
    }
    public String getMessages() {
        return messages;
    }
    public void setMessages(String messages) {
        this.messages = messages;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

这是当用户输入消息并点击发送按钮时执行的代码:

private void postMessages() {
    DatabaseReference database = FirebaseDatabase.getInstance().getReference("MessageTest");
    Log.e("Reference is : ", String.valueOf(databaseReference));
    String actual_msg = editText.getText().toString().trim();
    if (actual_msg.matches("")) {
        new AlertDialog.Builder(ChatActivity.this)
                .setTitle("Failed")
                .setMessage("Enter all fields/check Internet Connection")
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {

                    }
                }).show();
    } else {
        ChatModel chatModel = new ChatModel(actual_msg, mAuth.getUid());
        String id = database.push().getKey();
        database.child(id).setValue(chatModel).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Toast.makeText(ChatActivity.this, "Message Sent Successfully", Toast.LENGTH_SHORT).show();
                    editText.setText("");
                } else {
                    Toast.makeText(ChatActivity.this, "Message Sent Failed !", Toast.LENGTH_SHORT).show();
                }
            }

这是消息的加载方式:

  private void loadMessages() {
    msgRef = FirebaseDatabase.getInstance().getReference("MessageTest");
    Log.e("path1", msgRef.toString());
    msgRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            chatModelList = new ArrayList<>();
            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                ChatModel p = dataSnapshot1.getValue(ChatModel.class);
                chatModelList.add(p);
            }
            FirebaseRecyclerOptions<ChatModel> options =
                    new FirebaseRecyclerOptions.Builder<ChatModel>()
                            .setQuery(FirebaseDatabase.getInstance().getReference("MessageTest"), ChatModel.class)
                            .build();
            chatAdapter = new ChatAdapter(options, ChatActivity.this, chatModelList);
            chatAdapter.startListening();
            chatAdapter.notifyDataSetChanged();
            recyclerView.setAdapter(chatAdapter);
            String current_counts = String.valueOf(dataSnapshot.getChildrenCount());
            recyclerView.setAdapter(chatAdapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(ChatActivity.this));
        }

这是 ChatAdapter 的onBind()

 @Override
protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull ChatModel model) {

    ChatModel model1 = chatModelList.get(position);
    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
    holder.messages.setText(model1.getMessages());
    holder.userName.setText(model1.getUsername());

}

我已经尝试了所有方法,但无法将 UID 替换为用户名。

【问题讨论】:

  • @Stratubas 已添加先生,请检查
  • @Rohit 你能更准确地解释你要检索哪个节点吗?
  • @Ashish 是的,先生,如上面的屏幕截图所示,当用户发布消息时,您可以看到与消息一起显示的 UID。我只是想用“用户”节点中的名称替换发布消息的用户的 UID。
  • @Rohit 请检查我的回答

标签: android authentication firebase-realtime-database firebase-authentication chat


【解决方案1】:

此代码将帮助您从数据库中检索值并将其推送到另一个节点。但我对 Firebase 实时数据库中的 addOnCompleteListener 有疑问?

DatabaseReference databaseUsers = FirebaseDatabase.getInstance().child("Users").child(mAuth.getUid);
databaseUsers.addValueEventListener(new ValueEventListener() {
    @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String name = dataSnapshot.child("name").getValue(String.class);
            ChatModel chatModel = new ChatModel(actual_msg, name);
            String id = database.push().getKey();
            database.child(id).setValue(chatModel).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Toast.makeText(ChatActivity.this, "Message Sent Successfully", Toast.LENGTH_SHORT).show();
                        editText.setText("");
                    } else {
                        Toast.makeText(ChatActivity.this, "Message Sent Failed !", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
});

【讨论】:

  • 传奇以不同的形式出现,你以动漫角色的形式出现;)。非常感谢你
  • :) 再次感谢您,现在我可以继续进行了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多