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

Firebase实时数据库无法保存用户数据,请求代码修正方案

问题分析与修复方案

核心问题排查

  1. 未验证用户身份:数据库规则要求auth != null才能写入,但原代码未确认当前用户是否已登录,导致写入请求被规则拦截。
  2. 异步操作未正确处理:setValue()是异步执行的,原代码直接在调用后显示成功提示并跳转,无法捕获写入失败的情况,也不能确保操作完成。
  3. 用户ID生成逻辑不合理:使用push()生成随机ID不符合用户资料与账号绑定的逻辑,应使用Firebase认证用户的UID作为节点键。

修正后的代码

保存按钮点击事件代码

btnsaveprofile.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        username = edtxtusername.getText().toString().trim();
        profession = spinnerprofession.getSelectedItem().toString();

        if (username.isEmpty()){
            Toast.makeText(getApplicationContext(), "请输入您的姓名", Toast.LENGTH_SHORT).show();
        } else if (profession.equals(getString(R.string.select_profession))) {
            Toast.makeText(getApplicationContext(), "请选择您的职业", Toast.LENGTH_SHORT).show();
        } else {
            mprogressbarofsaveprofile.setVisibility(View.VISIBLE);
            btnsaveprofile.setVisibility(View.INVISIBLE);

            firebaseAuth = FirebaseAuth.getInstance();
            // 检查当前用户是否已登录
            FirebaseUser currentUser = firebaseAuth.getCurrentUser();
            if (currentUser == null) {
                Toast.makeText(getApplicationContext(), "用户未登录,请先完成登录", Toast.LENGTH_SHORT).show();
                mprogressbarofsaveprofile.setVisibility(View.INVISIBLE);
                btnsaveprofile.setVisibility(View.VISIBLE);
                return;
            }

            databaseReference = FirebaseDatabase.getInstance().getReference("users");
            // 使用当前用户的UID作为节点键,确保每个用户资料唯一绑定账号
            String userId = currentUser.getUid();
            User user = new User(username, profession);
            
            // 添加异步操作监听器,处理成功/失败场景
            databaseReference.child(userId).setValue(user)
                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show();
                            Intent intent = new Intent(getApplicationContext(), NexusHome.class);
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                            startActivity(intent);
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(getApplicationContext(), "保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                            // 恢复按钮状态
                            btnsaveprofile.setVisibility(View.VISIBLE);
                            mprogressbarofsaveprofile.setVisibility(View.INVISIBLE);
                        }
                    });
        }
    }
});

User实体类(无需修改,确认字段与Getter/Setter规范)

public class User {
    private String username;
    private String profession;

    public User() {
        // Firebase序列化需要空构造函数
    }

    public User(String username, String profession) {
        this.username = username;
        this.profession = profession;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getProfession() {
        return profession;
    }

    public void setProfession(String profession) {
        this.profession = profession;
    }
}

额外注意事项

  • 网络权限:确保AndroidManifest.xml中已添加网络权限:
    <uses-permission android:name="android.permission.INTERNET" />
    
  • Firebase依赖:确认项目已正确添加Firebase Realtime Database和Auth的依赖项。
  • 规则测试:若测试时需要临时开放权限(仅限开发阶段),可将规则改为:
    {
      "rules": {
        ".read": true,
        ".write": true
      }
    }
    
    上线前务必改回原规则。

内容的提问来源于stack exchange,提问作者Uday Makwana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:21:32