使用用户名原子性的Firebase用户注册

时间:2017-04-09 21:51:21

标签: android firebase firebase-authentication

我为Firebase创建了一个登录系统。用户可以使用用户名或密码进行身份验证。这可以通过在firebase数据库中创建一个链接用户名和电子邮件的表来实现。

问题在于,当用户注册时,他可以在" createUserWithEmailAndPassword()"之间做任何事情。调用firebase及其完成处理程序,我将用户添加到数据库。例如:返回上一个活动,暂停应用程序暂停,旋转屏幕,... 如果用户正在做这些事情,则可能是用户已注册但未写入数据库

如何确保此交易全部或全部?我想过使用一个在完成时自动停止的intentservice,但这真的是要走的路吗?

private void register(final String email,final String username,final String password)
{
   mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>()
   {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task)
        {
            Log.d("FIREBASE Register", "createUserWithEmail:onComplete:" + task.isSuccessful());
            showProgress(false);

            if(task.isSuccessful())
            {
                Resources res = getResources();
                SharedPreferences prefs = getSharedPreferences(res.getString(R.string.package_name), Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = prefs.edit();
                editor.putString("email",     email);
                editor.putString("password", password);
                editor.commit();


                // Write new user
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                writeNewUser(user.getUid(), username, email);

                // Send verification email
                sendVerificationEmail();

                // Sign out the user, to block the loginActivity from logging in the user (the email isn't verified)
                FirebaseAuth.getInstance().signOut();
            }
    }
}

2 个答案:

答案 0 :(得分:0)

我认为这是最好的方法,因为如果用户离开应用程序,会迫使他再做一切

@Override
public void onDestroy() {
    final FirebaseAuth mAuth=FirebaseAuth.getInstance();
    final FirebaseUser user=mAuth.getCurrentUser();
    final DatabaseReference mdatabase=FirebaseDatabase.getInstance().getReference().child("USERS NODE").child(user.getUid());
    mdatabase.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot==null){
                //DATA HAS NOT BEEN SUMBITED
                if(user!=null){

                    user.delete()
                            .addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()) {

                                    }
                                }
                            });
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });



}

答案 1 :(得分:0)

我通过使用服务来修复它,但经过长时间的研究后我发现将mAuth.createUserWithEmailAndPassword方法委托给HandlerThread也是一个很好的解决方案

来源:https://www.youtube.com/watch?v=adPLIAnx9og&t=78s (使用camera.open和onpreview回调的示例)