3

我正在制作具有用户个人资料的类似社交媒体的应用程序。我想在使用他们的uid注册时保存他们的个人资料数据。虽然注册成功,但配置文件不会保存在Firebase数据库中。我也检查了规则,并且为经过认证的用户设置了读写。如何在用户注册期间在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(); 
        } 
       } 

      }); 
} 


} 
+1

你可以看看logcat中,检查该行后有'许可denied'警告'ref.child( “用户”)。孩子(authData.getUid ())。setValue(map);' – Wilik

+0

@Wilik Nope,我没有在logcat上看到任何权限被拒绝。但是,我看到'D/FirebaseApp:通知0授权状态侦听器.'可能会给你一个提示? – Gian7

回答

4

createUserWithEmailAndPassword method reference

Tries to create a new user account with the given email address and password. If successful, it also signs the user in into the app.

这意味着你不必后再次验证用户注册过程完成。

为了确保任务完成,firebaseUser不为空,最好加AuthStateListenerFirebaseAuth而不是保存数据的内部onComplete方法,该代码是在the official guide

然后你可以保存,如果该数据用户被认证。

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); 
    } 
} 
+1

对不起,迟到的回应..我发现你的答案有帮助,但是,我没有使用地图,而是我使用POJO,因为我从其他指南阅读,这是专家建议。 :) – Gian7

+1

是啊同意,POJO更好。在Map中给出示例更简单。欢呼:) – Wilik

+0

我进入块内task.isSuccessfull ---->错误,但仍然呼吁AuthStateChanged方法以及 – Erum

2

假设,如果您要添加数据库的用户名,然后写

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

+0

如何检查建议的电子邮件是否已被注册? – Ethan

+2

@Ethan我认为你需要验证它,看到我的代码上面..'这是为了存储认证用户数据'这行'..我认为这是你如何检查你的电子邮件是否已经注册。或者,如果您的电子邮件已经注册,那么您的错误处理,请检查[完整错误列表](https://www.firebase.com/docs/android/guide/user-auth。(#) - 部分全错误) – Gian7

+0

@ Gian7好吧,谢谢 – Ethan

1

对于其他人有类似的问题,在火力地堡没有持续性数据的常见原因是孩子的名字在Realtime Database|Rules在Java代码中不匹配的名称:

enter image description here

的Java代码:

enter image description here

再次,你应该叫:

ref.child("users").child(firebaseUser.getUid()).setValue(<YOUR_POJO_OBJECT>);

代替

ref.child("users").child(authData.getUid()).setValue(map); 
相关问题