You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:47:03