Android Studio中Firebase实时数据库实现登录账号类型校验与跳转
嘿,我来帮你搞定这个需求!根据你的描述,咱们可以通过Firebase Auth登录后,查询实时数据库里的用户类型来实现跳转。下面分步骤给你讲清楚,附完整代码示例:
一、先明确合理的数据库结构(假设)
因为你没给出具体的数据库结构,我先假设一个最常用的结构,你可以根据自己的实际情况调整:
{ "users": { "user1%40example%2Ecom": { // 这里是编码后的邮箱:user1@example.com "email": "user1@example.com", "userType": "User Regular", "username": "普通用户1" }, "business1%40example%2Ecom": { // 编码后的邮箱:business1@example.com "email": "business1@example.com", "userType": "User Business", "shopName": "商家店铺1" } } }
或者你也可以用Firebase Auth的UID作为用户节点的键,这种情况下需要通过email字段做查询(后面会给出对应的代码)。
二、核心代码实现
1. 登录验证(Firebase Auth)
先完成用户的邮箱密码登录,登录成功后再去查询用户类型:
import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; public class LoginActivity extends AppCompatActivity { private EditText emailEditText, passwordEditText; private Button loginButton; private FirebaseAuth mAuth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); // 初始化控件和Firebase Auth emailEditText = findViewById(R.id.et_email); passwordEditText = findViewById(R.id.et_password); loginButton = findViewById(R.id.btn_login); mAuth = FirebaseAuth.getInstance(); // 登录按钮点击事件 loginButton.setOnClickListener(v -> { String email = emailEditText.getText().toString().trim(); String password = passwordEditText.getText().toString().trim(); // 输入校验 if (TextUtils.isEmpty(email) || TextUtils.isEmpty(password)) { Toast.makeText(LoginActivity.this, "请完整填写邮箱和密码", Toast.LENGTH_SHORT).show(); return; } // 调用Firebase Auth完成登录 mAuth.signInWithEmailAndPassword(email, password) .addOnCompleteListener(task -> { if (task.isSuccessful()) { // 登录成功,去查询用户类型 checkUserType(email); } else { // 登录失败,提示错误信息 Toast.makeText(LoginActivity.this, "登录失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } }); }); }
2. 查询用户类型并跳转
接下来实现checkUserType方法,这里分两种数据库结构的情况:
方案1:用编码后的邮箱作为用户节点键
private void checkUserType(String email) { FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference usersRef = database.getReference("users"); // 处理邮箱里的特殊字符(Firebase不允许节点键包含.和@) String encodedEmail = email.replace(".", "%2E").replace("@", "%40"); // 单次查询用户数据 usersRef.child(encodedEmail).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { if (snapshot.exists()) { // 获取用户类型 String userType = snapshot.child("userType").getValue(String.class); if (userType != null) { // 根据类型跳转对应首页 if (userType.equals("User Business")) { startActivity(new Intent(LoginActivity.this, BusinessHomeActivity.class)); } else if (userType.equals("User Regular")) { startActivity(new Intent(LoginActivity.this, RegularHomeActivity.class)); } else { Toast.makeText(LoginActivity.this, "未知用户类型", Toast.LENGTH_SHORT).show(); } } } else { Toast.makeText(LoginActivity.this, "未找到该用户的信息", Toast.LENGTH_SHORT).show(); } // 关闭当前登录页 finish(); } @Override public void onCancelled(DatabaseError error) { Toast.makeText(LoginActivity.this, "查询失败:" + error.getMessage(), Toast.LENGTH_SHORT).show(); } }); } }
方案2:用UID作为用户节点键(按email字段查询)
如果你的数据库是用UID作为节点键,比如:
{ "users": { "abc123XYZ": { "email": "user1@example.com", "userType": "User Regular", "uid": "abc123XYZ" } } }
那把checkUserType换成下面的代码即可:
private void checkUserType(String email) { FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference usersRef = database.getReference("users"); // 按email字段查询匹配的用户 usersRef.orderByChild("email").equalTo(email).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { if (!snapshot.getChildren().isEmpty()) { // 遍历查询结果(理论上只有一个用户) for (DataSnapshot userSnapshot : snapshot.getChildren()) { String userType = userSnapshot.child("userType").getValue(String.class); if (userType != null) { if (userType.equals("User Business")) { startActivity(new Intent(LoginActivity.this, BusinessHomeActivity.class)); } else if (userType.equals("User Regular")) { startActivity(new Intent(LoginActivity.this, RegularHomeActivity.class)); } else { Toast.makeText(LoginActivity.this, "未知用户类型", Toast.LENGTH_SHORT).show(); } } } } else { Toast.makeText(LoginActivity.this, "未找到该用户的信息", Toast.LENGTH_SHORT).show(); } finish(); } @Override public void onCancelled(DatabaseError error) { Toast.makeText(LoginActivity.this, "查询失败:" + error.getMessage(), Toast.LENGTH_SHORT).show(); } }); } }
三、重要注意事项
- 数据库权限设置:一定要确保你的Firebase数据库规则允许已登录用户读取自己的信息,否则会出现权限拒绝错误。比如可以设置这样的规则:
{ "rules": { "users": { "$userId": { ".read": "auth != null && auth.uid === $userId", ".write": "auth != null && auth.uid === $userId" } } } }
如果是用邮箱作为节点键,规则可以调整为:
{ "rules": { "users": { "$encodedEmail": { ".read": "auth != null && auth.email.replace('.', '%2E').replace('@', '%40') === $encodedEmail", ".write": "auth != null && auth.email.replace('.', '%2E').replace('@', '%40') === $encodedEmail" } } } }
- 实体类优化:如果用户信息字段较多,可以创建一个
User实体类,用snapshot.getValue(User.class)直接解析数据,代码会更整洁。 - 异常处理:代码里已经处理了登录失败、查询失败、用户不存在等情况,记得给用户友好的提示。
内容的提问来源于stack exchange,提问作者Aamer Salame
相关产品推荐
相关产品推荐

