Firebase用户uid在auth和db

时间:2019-06-07 23:01:52

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

我正在制作一个您必须登录才能继续的应用程序-如果您没有用户,则可以创建一个新帐户。这里没什么好看的。但是,当我创建一个新用户时(成功),我有一些要与用户UID作为唯一节点存储的用户有关的其他数据。

我的问题是,当我这样做时,用户身份验证UID与保存在数据库中的用户身份UID不同。参见下面的代码:

    private EditText editTextEmail, editTextPassword, editTextName, editTextAge;
    private Button btnSignup;

    private FirebaseAuth firebaseAuth;                                                         
    private DatabaseReference databaseReference;                                                


    @Override
    protected void  onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_signup);

        firebaseAuth = FirebaseAuth.getInstance();

        btnSignup = findViewById(R.id.btn_signUp2);
        editTextEmail = findViewById(R.id.editText_emailSignup);
        editTextPassword = findViewById(R.id.editText_passwordSignup);
        editTextName = findViewById(R.id.editText_nameSignup);
        editTextAge = findViewById(R.id.editText_ageSignup);

        btnSignup.setOnClickListener(this);

    }

    public void signUp(){                                                                       
        final String email = editTextEmail.getText().toString().trim();                       
        final String password = editTextPassword.getText().toString().trim();
        String name = editTextName.getText().toString().trim();
        String age = editTextAge.getText().toString().trim();

        if(TextUtils.isEmpty(email)){                                                           
            Toast.makeText(this, "Please enter an email", Toast.LENGTH_LONG).show();
            return;                                                                            
        }
        if(TextUtils.isEmpty(password)){
            Toast.makeText(this,"Please enter a password", Toast.LENGTH_LONG).show();
            return;
        }
        if(TextUtils.isEmpty(name)){
            Toast.makeText(this,"Please enter your name", Toast.LENGTH_LONG).show();
            return;
        }
        if(TextUtils.isEmpty(age)){
            Toast.makeText(this,"Please enter your age", Toast.LENGTH_LONG).show();
            return;
        }

        firebaseAuth.createUserWithEmailAndPassword(email, password)                            
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if(task.isSuccessful()){                                                
                            firebaseAuth.signInWithEmailAndPassword(email, password);
                            Toast.makeText(getApplicationContext(), "Register completed successfully", Toast.LENGTH_SHORT).show(); 
                        }else{
                            Toast.makeText(getApplicationContext(), "Error, please try again", Toast.LENGTH_SHORT).show();
                            return;                                                             
                        }
                    }
                });

        FirebaseUser fbUser = firebaseAuth.getCurrentUser();
        User user = new User(email, password, name, Integer.parseInt(age));                     
        databaseReference = FirebaseDatabase.getInstance().getReference("users");       
        databaseReference.child(fbUser.getUid().trim()).setValue(user);                         

        finish();                                                                               
        startActivity(new Intent(this, LoginActivity.class));

    }


    @Override
    public void onClick(View view) {
        if (view == btnSignup){
            signUp();
        }
    }

enter image description here enter image description here

如您所见,Uid不匹配。我在做什么错了?

我读到Firebase在创建用户时实际上并未登录用户,因此,如果创建成功,我尝试登录该用户。虽然没有任何改变。

3 个答案:

答案 0 :(得分:1)

首先要发表一些评论:

  1. 通过用于Firebase的Android SDK创建用户时,该用户已登录。因此,无需在signInWithEmailAndPassword处理程序中调用onComplete

    < / li>
  2. 您现在要在注册之前更新数据库,因为这是异步发生的。为了确保在写入数据库之前完成注册,请将数据库代码移至onComplete(甚至更好的onSuccess)处理程序中。

类似这样:

firebaseAuth
    .createUserWithEmailAndPassword(email, password)                            
    .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(task.isSuccessful()){                                                
                Toast.makeText(getApplicationContext(), "Register completed successfully", Toast.LENGTH_SHORT).show(); 

                FirebaseUser fbUser = firebaseAuth.getCurrentUser();
                User user = new User(email, password, name, Integer.parseInt(age));                     
                databaseReference = FirebaseDatabase.getInstance().getReference("users");       
                databaseReference.child(fbUser.getUid()).setValue(user);  
            }else{
                Toast.makeText(getApplicationContext(), "Error, please try again", Toast.LENGTH_SHORT).show();
                return;                                                             
            }
        }
    });

答案 1 :(得分:0)

我认为您需要了解createUserWithEmailAndPassword是异步的,并在创建用户之前立即返回。在创建用户之前,您将尝试进行数据库操作。如果有的话,他们将为以前登录的匿名用户创建数据。

如果要为新创建的用户添加一些数据,则应在回调中(在创建用户之后而不是在创建用户之前)进行操作。

还应该记住,如果已经有一个新用户登录,几乎可以肯定不希望创建新用户。考虑使用Firebase-UI处理用户登录,而不是自己编写代码。它将大大简化您的代码。

答案 2 :(得分:-1)

我解决了这个问题。我已经将此写为oncompletelistener上的第一个参数。