Android 在用户注册期间,如何在firebase的实时数据库中存储数据?

Android 在用户注册期间,如何在firebase的实时数据库中存储数据?,android,firebase,firebase-realtime-database,firebase-authentication,Android,Firebase,Firebase Realtime Database,Firebase Authentication,我正在制作一个类似社交媒体的应用程序,它有用户档案。我想在他们注册时使用uid保存他们的个人资料数据。虽然注册成功,但配置文件未保存在firebase数据库中。我还检查了规则,为经过身份验证的用户设置了读写 这是我的密码: public class RegisterActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_reg; private EditText etName

我正在制作一个类似社交媒体的应用程序,它有用户档案。我想在他们注册时使用uid保存他们的个人资料数据。虽然注册成功,但配置文件未保存在firebase数据库中。我还检查了规则,为经过身份验证的用户设置了读写

这是我的密码:

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener {

private Button btn_reg;
private EditText etName, etEmail, etPassword, etCPassword, etMobile, etSchoolCompany, etLocation;
private ProgressDialog progressDialog;
private FirebaseAuth firebaseAuth;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);

    Firebase.setAndroidContext(this);

    firebaseAuth = FirebaseAuth.getInstance();

    progressDialog = new ProgressDialog(this);

    btn_reg = (Button)findViewById(R.id.btnRegister);
    etName = (EditText)findViewById(R.id.etName);
    etEmail = (EditText)findViewById(R.id.etEmail);
    etPassword = (EditText)findViewById(R.id.etPassword);
    etCPassword = (EditText)findViewById(R.id.etCPassword);
    etMobile = (EditText)findViewById(R.id.etMobile);
    etSchoolCompany = (EditText)findViewById(R.id.etSchoolCompany);
    etLocation = (EditText)findViewById(R.id.etLocation);

    btn_reg.setOnClickListener(this);
}

@Override
public void onClick (View view){
    if(view == btn_reg){
        registerUser();
    }
}

private void registerUser(){
    String name = etName.getText().toString();
    String mobile = etMobile.getText().toString();
    String SchoolCompany = etSchoolCompany.getText().toString();
    String location = etLocation.getText().toString();
    final String email = etEmail.getText().toString().trim();
    final String password = etPassword.getText().toString().trim();
    String cpassword = etCPassword.getText().toString().trim();

    progressDialog.setMessage("Registering..");
    progressDialog.show();

    //REGISTERING USER
    firebaseAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if(task.isSuccessful()){

                        //THIS IS FOR STORING AUTHENTICATED USER'S DATA
                        final Firebase ref = new Firebase("https://myfirebase.firebaseio.com");
                        ref.authWithPassword(email, password, new Firebase.AuthResultHandler(){
                            @Override
                            public void onAuthenticated(AuthData authData){
                                // Authentication just completed successfully :)
                                Map<String, String> map = new HashMap<String, String>();
                                map.put("provider", authData.getProvider());
                                if(authData.getProviderData().containsKey("displayName")) {
                                    map.put("displayName", authData.getProviderData().get("displayName").toString());
                                }
                                ref.child("users").child(authData.getUid()).setValue(map);
                            }
                            @Override
                            public void onAuthenticationError(FirebaseError error) {
                //ERRORS TODO
                            }
                        });
                        progressDialog.hide();
                        Toast.makeText(RegisterActivity.this, "Registered Successfully", Toast.LENGTH_SHORT).show();
                    }else{
                        Toast.makeText(RegisterActivity.this, "Registration failed, please try again", Toast.LENGTH_SHORT).show();
                    }
                }

            });
}


}
公共类RegisterActivity扩展了AppCompatActivity实现了View.OnClickListener{
私人按钮btn_reg;
私人编辑文本etName、etmail、etPassword、etCPassword、etMobile、etSchoolCompany、etLocation;
私有进程对话;
私有FirebaseAuth FirebaseAuth;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u寄存器);
Firebase.setAndroidContext(this);
firebaseAuth=firebaseAuth.getInstance();
progressDialog=新建progressDialog(此);
btn_reg=(按钮)findViewById(R.id.btnRegister);
etName=(EditText)findViewById(R.id.etName);
etEmail=(EditText)findViewById(R.id.etEmail);
etPassword=(EditText)findViewById(R.id.etPassword);
etCPassword=(EditText)findViewById(R.id.etCPassword);
etMobile=(EditText)findViewById(R.id.etMobile);
etSchoolCompany=(EditText)findViewById(R.id.etSchoolCompany);
etLocation=(EditText)findViewById(R.id.etLocation);
btn_reg.setOnClickListener(此);
}
@凌驾
公共void onClick(视图){
如果(视图==btn_reg){
registerUser();
}
}
私有无效注册器(){
字符串名称=etName.getText().toString();
字符串mobile=etMobile.getText().toString();
字符串SchoolCompany=etSchoolCompany.getText().toString();
字符串位置=etLocation.getText().toString();
最终字符串email=etEmail.getText().toString().trim();
最终字符串密码=etPassword.getText().toString().trim();
字符串cpassword=etCPassword.getText().toString().trim();
progressDialog.setMessage(“注册…”);
progressDialog.show();
//注册用户
firebaseAuth.createUserWithEmailAndPassword(电子邮件,密码)
.addOnCompleteListener(这是新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
//这用于存储经过身份验证的用户数据
最终火基参考=新火基(“https://myfirebase.firebaseio.com");
ref.authWithPassword(电子邮件、密码、新Firebase.AuthResultHandler(){
@凌驾
已验证的公用void(AuthData AuthData){
//身份验证刚刚成功完成:)
Map Map=newhashmap();
put(“provider”,authData.getProvider());
if(authData.getProviderData().containsKey(“displayName”)){
map.put(“displayName”,authData.getProviderData().get(“displayName”).toString());
}
ref.child(“用户”).child(authData.getUid()).setValue(map);
}
@凌驾
AuthenticationError(FirebaseError)上的公共无效{
//要做的错误
}
});
progressDialog.hide();
Toast.makeText(RegisterActivity.this,“注册成功”,Toast.LENGTH_SHORT.show();
}否则{
Toast.makeText(RegisterActivity.this,“注册失败,请重试”,Toast.LENGTH\u SHORT.show();
}
}
});
}
}

假设您想在数据库中添加用户名,然后写入

String name = etName.getText().toString().trim();
然后只需创建
DatabaseReference
类的对象,例如:

 DatabaseReference myRootRef = FirebaseDatabase.getInstance().getReference();

 DatabaseReference userNameRef =  myRootRef.child("User Name");

 userNameRef.setValue(name);

// to add email
String email = etEmail.getText().toString().trim();
DatabaseReference userEmail = myRootRef.child("Email ");
userEmail.setValue(email);
以同样的方式,你可以为其余的事情这样做

这将把数据存储为JSON树,其中根目录是
myRootRef
,其子目录是
userNameRef

尝试使用给定的电子邮件地址和密码创建新用户帐户如果成功,它还会将用户登录到应用程序中。

这意味着您不需要在注册过程完成后再次对用户进行身份验证

为确保任务已完成且
firebaseUser
不为空,最好将
AuthStateListener
添加到
FirebaseAuth
中,而不是将数据保存在
onComplete
方法中,代码处于

如果用户经过身份验证,则可以保存数据

public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
    FirebaseUser user = firebaseAuth.getCurrentUser();
    if (user != null) {
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
        Map<String, String> map = new HashMap<>();
        map.put("provider", user.getProviders().get(0));
        if(user.getProviderData().containsKey("displayName")) {
            map.put("displayName", user.getProviderData().get("displayName").toString());
        }
        ref.child("users").child(user.getUid()).setValue(map);
    } 
}
authStateChanged(@NonNull FirebaseAuth FirebaseAuth)上的公共无效{ FirebaseUser=firebaseAuth.getCurrentUser(); 如果(用户!=null){ DatabaseReference ref=FirebaseDatabase.getInstance().getReference(); Map Map=newhashmap(); put(“provider”,user.getProviders().get(0)); if(user.getProviderData().containsKey(“displayName”)){ map.put(“displayName”,user.getProviderData().get(“displayName”).toString()); } ref.child(“用户”).child(user.getUid()).setValue(map); } }
对于其他有类似问题的人,Firebase中数据未持久化的常见原因是
实时数据库|规则
中的子名称与java代码中的名称不匹配:

Java代码:

同样,您应该拨打:

ref.child(“用户”).child(firebaseUser.getUid()).setValue()

而不是

 ref.child("users").child(authData.getUid()).setValue(map);

您可以查看日志猫,检查这一行
ref.child(“用户”).child(authData.getUid()).setValue(map)之后是否有
权限被拒绝
警告@Wilik不,我没有看到