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);