Firebase实时数据库实现3类用户UID注册登录及类型跳转问题
投票App Firebase开发问题解决方案
问题1:将Spinner选择的用户类型存入Firebase实时数据库
原代码中已获取Spinner选中的用户类型final String item = ChooseUser.getSelectedItem().toString();,只需在数据库写入逻辑中添加该字段存储,同时修正原代码中密码匹配判断的逻辑错误(原条件写反):
修改Register.java的数据库写入部分
// 原有用户信息写入逻辑后,新增存储用户类型的代码 databaseReference.child("users").child(txtIcNum).child("fullname").setValue(txtfullname); databaseReference.child("users").child(txtIcNum).child("email").setValue(txtEmail); databaseReference.child("users").child(txtIcNum).child("phone").setValue(txtPhone); databaseReference.child("users").child(txtIcNum).child("pass").setValue(txtpass); // 新增:存储用户类型 databaseReference.child("users").child(txtIcNum).child("userType").setValue(item);
修正密码匹配判断错误
// 原代码条件写反,改为: else if(!txtpass.equals(txtconPass)){ Toast.makeText(Register.this,"密码不匹配",Toast.LENGTH_LONG).show(); }
问题2:使用Firebase UID作为用户唯一标识替代IC卡号
借助Firebase Authentication自动生成唯一UID替代IC卡号,步骤如下:
1. 修改Register.java集成Firebase Auth
首先添加Firebase Auth实例:
// 在类内声明FirebaseAuth对象 FirebaseAuth mAuth = FirebaseAuth.getInstance();
然后替换原注册逻辑,用Firebase Auth创建用户并获取UID:
SignUp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // ... 原有字段获取代码保持不变 ... if(txtfullname.isEmpty() || txtIcNum.isEmpty() || txtEmail.isEmpty() || txtPhone.isEmpty() || txtpass.isEmpty() || txtconPass.isEmpty()){ Toast.makeText(Register.this, "所有字段均为必填项", Toast.LENGTH_LONG).show(); } else if(!txtpass.equals(txtconPass)){ Toast.makeText(Register.this,"密码不匹配",Toast.LENGTH_LONG).show(); } else { // 使用Firebase Auth创建用户 mAuth.createUserWithEmailAndPassword(txtEmail, txtpass) .addOnCompleteListener(Register.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // 获取Firebase自动生成的UID String userId = mAuth.getCurrentUser().getUid(); // 用UID作为节点存储用户信息 databaseReference.child("users").child(userId).child("fullname").setValue(txtfullname); databaseReference.child("users").child(userId).child("icNum").setValue(txtIcNum); databaseReference.child("users").child(userId).child("email").setValue(txtEmail); databaseReference.child("users").child(userId).child("phone").setValue(txtPhone); databaseReference.child("users").child(userId).child("userType").setValue(item); Toast.makeText(Register.this, "用户注册成功", Toast.LENGTH_LONG).show(); finish(); } else { Toast.makeText(Register.this, "注册失败:" + task.getException().getMessage(), Toast.LENGTH_LONG).show(); } } }); } } });
2. 调整数据库结构
原结构users -> IC卡号 -> 用户信息改为users -> Firebase UID -> 用户信息,UID由Firebase自动维护唯一性,无需手动校验。
问题3:登录后根据用户类型跳转对应页面
改用Firebase Auth完成登录验证,成功后从数据库读取用户类型并跳转对应页面:
1. 修改Login.java添加Firebase Auth实例
FirebaseAuth mAuth = FirebaseAuth.getInstance(); DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReferenceFromUrl("https://science-eagerness-5aa6a-default-rtdb.firebaseio.com/");
2. 修改登录逻辑实现类型跳转
login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final String email = username.getText().toString(); final String pass = password.getText().toString(); if (email.isEmpty() || pass.isEmpty()) { Toast.makeText(Login.this, "请输入邮箱和密码", Toast.LENGTH_LONG).show(); } else { // 用Firebase Auth验证登录 mAuth.signInWithEmailAndPassword(email, pass) .addOnCompleteListener(Login.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { String userId = mAuth.getCurrentUser().getUid(); // 从数据库获取用户类型 databaseReference.child("users").child(userId).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { String userType = snapshot.child("userType").getValue(String.class); // 根据类型跳转对应页面 Intent intent; switch (userType) { case "Admin": intent = new Intent(Login.this, AdminHome.class); break; case "Voter": intent = new Intent(Login.this, VoterHome.class); break; case "Moderator": intent = new Intent(Login.this, ModeratorHome.class); break; default: intent = new Intent(Login.this, DefaultHome.class); break; } startActivity(intent); finish(); Toast.makeText(Login.this, "登录成功", Toast.LENGTH_SHORT).show(); } @Override public void onCancelled(DatabaseError error) { Toast.makeText(Login.this, "获取用户信息失败", Toast.LENGTH_SHORT).show(); } }); } else { Toast.makeText(Login.this, "登录失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } } }); } } });
注:需确保项目已添加Firebase Authentication依赖,并在Firebase控制台开启邮箱/密码登录方式。
内容的提问来源于stack exchange,提问作者Riya
相关产品推荐
相关产品推荐

