簡體   English   中英

如何從 Firebase 獲取特定用戶的用戶名?

[英]How to get Username of Specific User from Firebase?

我正在 android 中制作一個群聊應用程序,其中數據庫是 Firebase 實時數據庫。

在注冊用戶時,我成功地將用戶的“用戶名”和“電子郵件”保存在 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 
    }
}

首先,我強烈建議您稍微更改存儲用戶數據的結構。 您現在正在使用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();
    }
  }
}

在上面的代碼片段中, userName是您活動類的成員字段,因此您也可以在其他地方訪問它。

此代碼運行后,您可以通過以下方式將用戶名寫入消息:

  1. 將用戶名的屬性添加到ChatModel
  2. 每次創建ChatModel實例時,設置使用代碼片段加載的用戶名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM