【问题标题】:How to get Username of Specific User from Firebase?如何从 Firebase 获取特定用户的用户名?
【发布时间】:2020-05-05 05:04:32
【问题描述】:

我正在android中制作一个群聊应用程序,其中数据库是 Firebase Realtime DB。

在注册用户时,我成功地将用户的“用户名”和“电子邮件”保存在 Firebase 的“用户”节点中。

问题是当他/她发布消息时如何在聊天中获取特定人的姓名?

这是我的注册活动,我在数据库中保存了“用户名”和“电子邮件”作为新用户注册:

FirebaseAuth mAuth;
 mAuth = FirebaseAuth.getInstance();
     private void DOSignup() {
        final String get_name = name.getText().toString().trim();
        final String get_email = email.getText().toString().trim();
        String get_password = password.getText().toString().trim();

        mAuth.createUserWithEmailAndPassword(get_email, get_password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {

                    FirebaseUser firebaseUser = mAuth.getCurrentUser();
                    Log.e("Current User", firebaseUser.toString());
                    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
                    GetUserName getUserName = new GetUserName(get_name, get_email);
                    String id = databaseReference.push().getKey();
                    databaseReference.child(id).setValue(getUserName);
                    Toast.makeText(getApplicationContext(), "Registration successful!", Toast.LENGTH_LONG).show();
                    Intent intent = new Intent(SignUpActivity.this, LoginActivity.class);
                    startActivity(intent);
                } else {
                    Toast.makeText(getApplicationContext(), "Registration failed! Please try again later", Toast.LENGTH_LONG).show();
                }
            }
        });

这是用户发布消息的方式:

     private void postMessages() {
        databaseReference = FirebaseDatabase.getInstance().getReference("MessageTest");
        Log.e("Reference is : ", String.valueOf(databaseReference));
        String actual_msg = editText.getText().toString().trim();

ChatModel chatModel = new ChatModel(actual_msg);
            String id = databaseReference.push().getKey();
            databaseReference.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();
                    }
                }
            });
        }

这是我的 ChatModel 类:

 public class ChatModel {
    String messages;
    public ChatModel() {
    }
    public ChatModel(String messages) {
        this.messages = messages;
    }
    public String getMessages() {
        return messages;
    }
}

这是我的 ChatAdapter 类,其中向用户显示消息:

public class ChatAdapter extends FirebaseRecyclerAdapter<ChatModel, ChatAdapter.ViewHolder> {
Context context;
List<ChatModel> chatModelList;
public ChatAdapter(@NonNull FirebaseRecyclerOptions<ChatModel> options, Context context, List<ChatModel> chatModelList) {
    super(options);
    this.context = context;
    this.chatModelList = chatModelList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_layout,
            parent, false);
    return new ViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull ChatModel model) {
    ChatModel model1 = chatModelList.get(position);
    GetUserName getUserName = new GetUserName();
    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
    holder.messages.setText();
    holder.userName.setText(databaseReference.getKey());
}
class ViewHolder extends RecyclerView.ViewHolder {
    TextView messages,userName;
    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        messages = itemView.findViewById(R.id.message_body);
        userName = itemView.findViewById(R.id.userName); //This is a TextView where usernames need to be shown 
    }
}

【问题讨论】:

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


    【解决方案1】:

    首先,我强烈建议您稍微改变存储用户数据的结构。您现在正在使用 push() 生成唯一密钥。但是由于每个用户已经有一个唯一的 UID,您可以将用户存储在该 UID 下,以便更轻松地查找它们。要将其存储在此结构中:

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
    GetUserName getUserName = new GetUserName(get_name, get_email);
    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    databaseReference.child(uid).setValue(getUserName);
    

    有了这些,让我们开始在将消息写入数据库时​​使用用户名。


    您需要在应用启动并登录时加载当前用户的姓名。其代码如下所示:

    if (FirebaseAuth.getInstance().getCurrentUser() != null) {
      String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
      DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
      DatabaseReference userReference = databaseReference.child(uid);
      userReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
          userName = dataSnapshot.child("UserName").getValue(String.class);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            throw databaseError.toException();
        }
      }
    }
    

    上面的sn-p userName是你activity类的成员字段,这样你也可以在其他地方访问它。

    此代码运行后,您可以通过以下方式将用户名写入消息:

    1. 为您的ChatModel 类添加用户名属性
    2. 每次创建ChatModel 实例时,设置您使用代码sn-p 加载的用户名。

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多