如何从 Firebase 获取特定用户的用户名?
Posted
技术标签:
【中文标题】如何从 Firebase 获取特定用户的用户名?【英文标题】:How to get Username of Specific User from 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
【问题讨论】:
【参考方案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类的成员字段,这样你也可以在其他地方访问它。
此代码运行后,您可以通过以下方式将用户名写入消息:
-
为您的
ChatModel
类添加用户名属性
每次创建ChatModel
实例时,设置您使用代码sn-p 加载的用户名。
【讨论】:
以上是关于如何从 Firebase 获取特定用户的用户名?的主要内容,如果未能解决你的问题,请参考以下文章
如何从所有用户 ID (UID) 中获取特定值并保存在 RecyclerView Firebase UI
如何从 Firebase android kotlin 获取所有具有特定价值的孩子?
如何从 firebase 获取特定文档数据并以字符串形式返回