android - Firebase 数据库和身份验证中同一用户的 UID 不同
问题描述
我需要检索存储在 Firebase 数据库中的数据。但这表明 UID 在身份验证部分和数据库部分是不同的。
更新:现在我在尝试从 firebase 获取数据时遇到问题。我想在 ListView 中显示它。当我从登录活动(成功登录后)转到常规活动(我放置 ListView 的位置)时,它不会显示并且活动从常规切换到登录活动。我将代码段附加在“更新代码”下的底部。帮助将不胜感激。谢谢!
这是注册代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_registration);
setUpUIviews();
firebaseAuth = FirebaseAuth.getInstance();
db = FirebaseDatabase.getInstance().getReference().child("users");
Register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (validate()){
String user_email = REmail.getText().toString().trim();
String user_password = RPass.getText().toString().trim();
firebaseAuth.createUserWithEmailAndPassword(user_email,user_password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
updateData();
Toast.makeText(Registration.this,"Registration Successful! ",Toast.LENGTH_SHORT).show();
startActivity(new Intent(Registration.this,MainActivity.class));
}else {
Toast.makeText(Registration.this,"Registration Unsuccessful ",Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
这是更新数据部分:
private void updateData(){
String uName = RName.getText().toString().trim();
String uEmail = REmail.getText().toString().trim();
String id = db.push().getKey();
ProfileUpdate profileUpdate = new ProfileUpdate(uName,uEmail);
db.child(id).setValue(profileUpdate);
Toast.makeText(this,"Added info",Toast.LENGTH_SHORT).show();
}
更新代码
Login Activity
public class LoginPage extends AppCompatActivity {
private TextView userRegistration;
private TextView Info;
private EditText LName;
private EditText LPass;
private Button LSignIn;
private int counter = 3;
private FirebaseAuth firebaseAuth;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loginpage);
userRegistration = (TextView)findViewById(R.id.tvRegister);
LName = (EditText)findViewById(R.id.btnName);
LPass = (EditText)findViewById(R.id.btnPass);
LSignIn = (Button) findViewById(R.id.btnSignIn);
Info = (TextView) findViewById(R.id.tvInfo);
Info.setText( " No of attempts remaining: 3 " );
firebaseAuth = FirebaseAuth.getInstance();
progressDialog = new ProgressDialog(this);
FirebaseUser user= null;
if(user!=null){
finish();
startActivity(new Intent(LoginPage.this,General.class));
}
user = firebaseAuth.getCurrentUser();
LSignIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
validate(LName.getText().toString(),LPass.getText().toString());
}
});
userRegistration.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(LoginPage.this,Registration.class));
}
});
}
private void validate(String username, String password){
progressDialog.setMessage("Processing your request.... ");
progressDialog.show();
firebaseAuth.signInWithEmailAndPassword(username,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
progressDialog.dismiss();
Toast.makeText(LoginPage.this,"Login successful!",Toast.LENGTH_SHORT).show();
startActivity(new Intent(LoginPage.this,General.class));
}else {
Info.setText("No of attempts remaining: " + String.valueOf(counter-1));
Toast.makeText(LoginPage.this,"Please enter corrent credentials",Toast.LENGTH_SHORT).show();
counter --;
progressDialog.dismiss();
if(counter<=0){
LSignIn.setEnabled(false);
}
}
}
});
}
}
General Activity
public class General extends AppCompatActivity {
private FirebaseAuth firebaseAuth;
private Button Logout;
ListView l1;
ArrayAdapter<String> adapter;
DatabaseReference databaseReference;
FirebaseUser user;
List<String> itemlist;
String uid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_general);
firebaseAuth = FirebaseAuth.getInstance();
Logout = (Button) findViewById(R.id.btnLogout);
l1 = (ListView)findViewById(R.id.listView);
user = FirebaseAuth.getInstance().getCurrentUser();
uid = user.getUid();
itemlist = new ArrayList<>();
databaseReference = FirebaseDatabase.getInstance().getReference();
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
itemlist.clear();;
String user_name = dataSnapshot.child(uid).child("usrName").getValue(String.class);
String user_email = dataSnapshot.child(uid).child("ursEmail").getValue(String.class);
itemlist.add(user_name);
itemlist.add(user_email);
adapter = new ArrayAdapter<>(General.this,android.R.layout.simple_list_item_1,itemlist);
l1.setAdapter(adapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Logout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
firebaseAuth.signOut();
finish();
startActivity(new Intent(General.this, MainActivity.class));
}
});
}
}
activity_general.xml file
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/myApp"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".General">
<Button
android:id="@+id/btnLogout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="LOGOUT"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.467"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/listView" />
<ListView
android:id="@+id/listView"
android:layout_width="368dp"
android:layout_height="270dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
该设计
解决方案
这是您如何将用户数据存储到数据库中的代码:
String id = db.push().getKey();
ProfileUpdate profileUpdate = new ProfileUpdate(uName,uEmail);
db.child(id).setValue(profileUpdate);
在第一行中,您调用push().getKey()
以从数据库 SDK 获取新的唯一 ID。此 ID 与用户配置文件无关。
如果要将用户存储在其 UID 下的数据库中,则需要AuthResult
在创建用户后立即获取 UID。就像是:
String uid = task.getResult().getUser().getUid();
当您将其传递uid
给您的updateData
方法时,您将创建数据库的子节点:
db.child(uid).setValue(profileUpdate);
推荐阅读
- c# - 蓝牙 LE 服务器可以使用蓝牙向客户端发送通知吗?
- c - 锁定 C 中的分叉进程之间共享的内存
- javascript - clearInterval 不会停止计时器
- node.js - 在单个产品的 GET 上更新 Top-product-list 的 CountValue
- autodesk-forge - NWD (FBX) 到 SVF 的转换 - 在 Forge Viewer 中找不到纹理
- google-sheets - 如何从谷歌表格中列的逗号分隔值创建计数图?
- java - 将 java 字符串转换为扩展 ascii 字符集(代码页 437)
- pandas - 如何在 pandas DF 列中找出哪些值不能使用 astype 函数转换为“int”类型
- scala - 加入大数据帧和小数据帧时的广播数据帧和过滤器
- docker - docker:来自守护进程的错误响应:驱动程序编程外部连接失败