Android 在用户注册期间,如何在firebase的实时数据库中存储数据?
我正在制作一个类似社交媒体的应用程序,它有用户档案。我想在他们注册时使用uid保存他们的个人资料数据。虽然注册成功,但配置文件未保存在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
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不,我没有看到