Firebase实时数据库&验证

时间:2016-09-16 11:13:08

标签: android firebase firebase-realtime-database firebase-authentication

我最近为后端工作采用了Firebase。使用Firebase我想将所有用户数据(如用户名,电话号码等)存储到同一RegisterActivity的Firebase中,而不仅仅是电子邮件&密码。我怎样才能做到这一点?

我的RegisterActivity只会在安装时出现。当用户注册我的应用程序时,我正在销毁该活动。因此,RegisterActivity没有进一步的实例。

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

我想保存名称,电子邮件和&amp;注册期间在firebase数据库中打电话,并在此之后销毁活动。

3 个答案:

答案 0 :(得分:1)

我现在正在same problem工作。问题是,登录(身份验证)和注册(注册)是两回事。

我所做的是有两个独立的活动,即signIN ...和signUP(注册)。

用户注册后(电子邮件和密码),他们将拥有Firebase已知的唯一用户ID。

接下来,他们进入注册活动,所以当你&#34;上传&#34;来自此活动中editTexts的所有数据,您可以将它们上传到数据库中与userID相匹配的节点(key ... index),以便数据库中的数据如下所示:

\ mydatabase \ users \ [uniqueID] \

如果您将两个活动(身份验证和注册)合并为一个...包含多个字段,&#34;电子邮件,密码,姓名,电话号码等等#34;在一个活动中,您仍然需要在下次使用过期会话运行应用时,单独使用signIN活动。我认为做两个单独的活动要简单得多。

答案 1 :(得分: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
}
}

答案 2 :(得分: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