-1

我最近爲我的後端工作採用了Firebase。使用Firebase我希望將所有用戶數據(如用戶名,電話號碼等)存儲到Firebase中,並保存在同一個RegisterActivity中,而不僅僅是電子郵件&密碼。我怎樣才能做到這一點?我的RegisterActivity只會在安裝時出現。當用戶註冊到我的應用程序時,我正在銷燬該活動。因此,還沒有RegisterActivity的實例。Firebase實時數據庫和身份驗證

RegisterActivity - onCreate()

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Firebase.setAndroidContext(this); 
    setContentView(R.layout.activity_register); 

    initialization(); 
    underlineText(); //Underlining Text in App 

    userObj = new User(); 
    userObj.setName(NAME); 
    userObj.setEMAIL(EMAIL); 
    userObj.setPHONE(PHN); 

    animShake = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.shake);  //Animation 

    vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); //Vibration 

    reg.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      submitForm(); //Registration Click Listener 
     } 
    }); 

    skip.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      skipRegistrationSection(); //Skip Click Listener 
     } 
    }); 

    runAtInstallation(); 
} 

submitform()

private void submitForm() { 

    if (!checkName()) { 
     name.setAnimation(animShake); 
     name.startAnimation(animShake); 
     vib.vibrate(60); 
     return; 
    } 
    if (!checkEmail()) { 
     email.setAnimation(animShake); 
     email.startAnimation(animShake); 
     vib.vibrate(60); 
     return; 
    } 
    if (!checkPhone()) { 
     phone.setAnimation(animShake); 
     phone.startAnimation(animShake); 
     vib.vibrate(60); 
     return; 
    } 
    if (!checkPassword()) { 
     password.setAnimation(animShake); 
     password.startAnimation(animShake); 
     vib.vibrate(60); 
     return; 
    } 
    if (!checkConfirmPassword()) { 
     confirmPassword.setAnimation(animShake); 
     confirmPassword.startAnimation(animShake); 
     vib.vibrate(60); 
     return; 
    } 

    nameLayout.setErrorEnabled(false); 
    emailLayout.setErrorEnabled(false); 
    phoneLayout.setErrorEnabled(false); 
    passwordLayout.setErrorEnabled(false); 
    confirmPasswordLayout.setErrorEnabled(false); 

    NAME = name.getText().toString().trim(); 
    EMAIL = email.getText().toString().trim(); 
    PHN = phone.getText().toString().trim(); 
    PASSWORD = password.getText().toString(); 

    progressBar.setVisibility(View.VISIBLE); 

    authUser();  //authenticating User via Email & Password 

} 

authUser()

private void authUser() { 

    mFirebaseAuth.createUserWithEmailAndPassword(EMAIL, PASSWORD).addOnCompleteListener(RegisterActivity.this, new OnCompleteListener<AuthResult>() { 
     @Override 
     public void onComplete(@NonNull Task<AuthResult> task) { 

      if (!task.isSuccessful()) { 
       AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this); 
       builder.setMessage(task.getException().getMessage()) 
         .setTitle("Error") 
         .setPositiveButton(android.R.string.ok, null); 
       AlertDialog dialog = builder.create(); 
       dialog.show(); 
       progressBar.setVisibility(View.GONE); 
      } else { 
       progressBar.setVisibility(View.GONE); 

       Intent intent = new Intent(RegisterActivity.this, MainActivity.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
       startActivity(intent); 
      } 
     } 

    }); 
} 

runAtInstallation

private void runAtInstallation() { 

    SharedPreferences pref = getSharedPreferences("ActivityPREF", Context.MODE_PRIVATE); 
    if (pref.getBoolean("activity_executed", false)) { 

     Intent act = new Intent(getApplicationContext(), MainActivity.class); 
     act.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     act.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     startActivity(act); 
     finish(); 
    } else { 
     SharedPreferences.Editor ed = pref.edit(); 
     ed.putBoolean("activity_executed", true); 
     ed.commit(); 
    } 
} 

我想在註冊期間將名稱,電子郵件,&電話保存在Firebase數據庫中,並在此之後銷燬該活動。

+0

我們需要更多信息來幫你。例如,向我們展示您在「RegisterActivity」中的代碼,並解釋問題所在以及您遇到的問題。 –

+0

@XaverKapeller我編輯了我的查詢。請看一看 !!感謝U –

+0

是否要添加個人資料照片,電話號碼等,以認證用戶? –

回答

1

我正在研究same problem。事情是,登錄(認證)和註冊(註冊)是兩回事。

我所做的是有兩個單獨的活動,signIN ...和signUP(註冊)。

一旦用戶註冊(電子郵件和密碼),他們將擁有Firebase已知的唯一用戶ID。

接下來,他們轉到註冊活動,因此當您在此活動中從editTexts「上傳」所有數據時,可以將它們上載到數據庫中與節點(key ... index)匹配的節點(key ... index) ...所以你在你的數據庫中的數據是這樣的:

\ MyDatabase的\用戶\ [UNIQUEID] \

如果合併這兩個活動比較(認證和登記)到一個...有許多領域,「電子郵件,密碼,姓名,電話號碼等。「所有這一切都在一個活動中,那麼當他們下次運行應用程序並且過期的會話時,您仍然需要單獨進行一次signIN only活動。我認爲做兩個單獨的活動要簡單得多。

+0

我有兩個單獨的活動用於登錄和註冊。但在註冊時,我想將用戶名,電子郵件和手機保存在數據庫中,並將用戶直接保存到「MainActivity」中。 –

+0

在你的問題中,有3件事情,登錄,註冊,註冊。所以如果沒有註冊,用戶無法登錄和註冊完全是另一回事。但或多或少,我們都有同樣的問題。 –

+0

我想如果@XaverKapeller看看他會有比我可以給你更好的答案......儘管我在文章中描述了一些可能的解決方案。 –

0

我有一個活動,我只是嘗試立即註冊,無論用戶是否存在,然後如果錯誤是由於已經存在的電子郵件,我簽署用戶而不是註冊它們。

mAuth = FirebaseAuth.getInstance(); 
mAuth.createUserWithEmailAndPassword(email, password) 
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
@Override 
public void onComplete(@NonNull Task<AuthResult> task) {      
if (!task.isSuccessful()) { 
if(task.getException() instanceof FirebaseAuthUserCollisionException) { 
// login user 
} 
else { 
// handle error 
} 
}  
else { 
// register user 
} 
} 
+0

但是那麼他們會無緣無故地填寫所有的註冊表格,不是嗎?他們也會感到困惑,並認爲他們的賬戶已被刪除。 –

+0

對我來說,這是一個簡單的電子郵件和密碼登錄,因此他們不需要登錄時再次填寫一個巨大的註冊表單。 –

0

您可以添加用戶資料信息和其他細節,如

對於更新個人資料

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder() 
     .setDisplayName("Jane Q. User") 
     .setPhotoUri(Uri.parse("https://example.com/jane-q-user/profile.jpg")) 
     .build(); 

user.updateProfile(profileUpdates) 
     .addOnCompleteListener(new OnCompleteListener<Void>() { 
      @Override 
      public void onComplete(@NonNull Task<Void> task) { 
       if (task.isSuccessful()) { 
        Log.d(TAG, "User profile updated."); 
       } 
      } 
     }); 

欲瞭解更多詳情,管理用戶的詳細信息,請參閱此鏈接Firebase manage user