我正在尝试获取并显示用户登录时的信息。(例如:姓名,电子邮件,电话)
我尝试了在YouTube和堆栈溢出中找到的多个代码段,但它们均失败了。大多数教程使用实时数据库,这不是我想要的。
我也尝试过制作一个“用户”对象。
private void getData(){
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("users")
//.document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.whereEqualTo("email:", FirebaseAuth.getInstance().getCurrentUser().getUid())
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
//Toast.makeText(getApplicationContext(),document.getId() +"==>" + document.getData(),Toast.LENGTH_LONG).show();
//Toast.makeText(getApplicationContext(),""+ document.get("Email") ,Toast.LENGTH_LONG).show();
nameEdt.setText((CharSequence) document.get("First Name"));
emailEdt.setText((CharSequence) document.get("Email"));
phoneEdt.setText((CharSequence) document.get("Phone"));
}
} else {
Toast.makeText(getApplicationContext(),"No such document",Toast.LENGTH_LONG).show();
}
}
});
}
我了解firestore中的文档与用户无关,但是我不知道如何设置代码,以使其仅从已登录的用户中检索数据* 新创建的帐户,但是如果我要注销并使用其他用户登录,则不会更新“帐户/用户信息”。
简而言之,我如何从已登录的用户访问和显示我的数据库信息?
附加说明:我正在使用电子邮件和密码进行身份验证
答案 0 :(得分:3)
要访问存储在Firestore中的用户数据,它应该没有您想象的那么复杂,不需要查询,您只需要获取与用户uid相对应的文档,并获取特定字段或执行任何操作即可需要他们,像这样:
db.collection("users").document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.get().addOnCompleteListener(task -> {
if(task.isSuccessful() && task.getResult() != null){
String firstName = task.getResult().getString("First Name");
String email = task.getResult().getString("Email");
String phone = task.getResult().getString("Phone");
//other stuff
}else{
//deal with error
}
});
原始答案:
用户信息未存储在Firestore数据库中,它们与您为登录设置的Firebase身份验证相关联。要检索相关的用户信息,您需要使用相关的FirebaseAuth
API。使用它来检索当前登录用户:
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
然后,您可以使用以下内容获取名称和电子邮件地址:
String name = user.getDisplayName();
String email = user.getEmail();
有关更多信息,请参阅documentation。
如果FirebaseAuth
无法解析,则可能意味着您未正确遵循设置指南,并忘记了在gradle文件中包含依赖项:
implementation 'com.google.firebase:firebase-auth:17.0.0'
答案 1 :(得分:0)
经过几天的努力,我试图找到一种解决方案,然后发现了一种能够从数据库中检索用户信息的解决方案。但是,需要特别注意的是,由于我的应用程序未保存大量数据,因此该结构对我有用。
因此,我基本上是在正确的轨道上,但是由于对火力基础缺乏理解,我错过了一些概念。
private void getData(){
FirebaseFirestore db = FirebaseFirestore.getInstance();
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
final String current = user.getUid();//getting unique user id
db.collection("users")
.whereEqualTo("uId",current)//looks for the corresponding value with the field
// in the database
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
nameEdt.setText((CharSequence) document.get("firstName"));
emailEdt.setText((CharSequence) document.get("email"));
phoneEdt.setText((CharSequence) document.get("phone"));
// These values must exactly match the fields you have in your db
}
}
如前所述,文档不与用户关联,但是您可以通过在数据库中创建一个名为“无论您想要什么”的字段来将它们链接在一起(我将其设为uId)。这是因为Firebase在通过身份验证时会为每个用户生成一个唯一的ID。通过创建包含该唯一ID的字段,您可以检索该集合中的关联信息。
如何创建字段: 我创建了一个“用户”对象,该对象将从我的编辑文本中获取uid。在我的代码中,无论我在哪里创建/验证新用户/帐户,都将uid传递给它。
FirebaseUser testUser = FirebaseAuth.getInstance().getCurrentUser(); //getting the current logged in users id
String userUid = testUser.getUid();
String uidInput = userUid;
User user = new User(firstNameInput,lastNameInput,uidInput);
db.collection("users").document(userUid)
.set(user)
.addOnSuccessListener(new OnSuccessListener<Void>() {
注意:我相信您也可以将其添加到哈希映射中。