При регистрации не создается ни одной связанной базы данных пользователя - Firebase - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь выполнить аутентификацию пользователя с помощью Firebase и одновременно сохранить полное имя пользователя и адрес электронной почты в базе данных, связанной с UID пользователя, который создается во время аутентификации.Здесь имя моей таблицы базы данных - Users, и я пытался с помощью следующего кода связать информацию о моем пользователе с ее UID.

С помощью следующего кода пользователь регистрируется, но соответствующая база данных не создается.Что я здесь не так делаю?Заранее спасибо за предложение.

public class SignUpActivity extends AppCompatActivity implements View.OnClickListener {

    EditText editTextFullName, editTextEmail, editTextPassword;

    private FirebaseAuth mAuth;
    FirebaseDatabase database;
    DatabaseReference ref;
    Users users;

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

        editTextFullName = (EditText) findViewById(R.id.editTextFullName);
        editTextEmail = (EditText) findViewById(R.id.editTextEmail);
        editTextPassword = (EditText) findViewById(R.id.editTextPassword);
        database = FirebaseDatabase.getInstance();
        ref = database.getReference("Users");
        users = new Users();
        mAuth = FirebaseAuth.getInstance();
        findViewById(R.id.buttonSignUp).setOnClickListener(this);
    }

    private void getValues() {
        users.setFullName(editTextFullName.getText().toString());
        users.setEmail(editTextEmail.getText().toString());
    }

    private void registerUser() {
        final String fullname = editTextFullName.getText().toString().trim();
        String email = editTextEmail.getText().toString().trim();
        String password = editTextPassword.getText().toString().trim();

        mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                progressBar.setVisibility(View.GONE);
                if (task.isSuccessful()) {
                    finish();
                    startActivity(new Intent(SignUpActivity.this, ProfileActivity.class));

                    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                    ref.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            getValues();
                            ref.child(""+ user +"").setValue(users);
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                } else {

                    if (task.getException() instanceof FirebaseAuthUserCollisionException) {
                        Toast.makeText(getApplicationContext(), "You are already registered", Toast.LENGTH_SHORT).show();

                    } else {
                        Toast.makeText(getApplicationContext(), task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                    }

                }
            }
        });

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.buttonSignUp:
                registerUser();
                break;
        }
    }
}

Примерно так: enter image description here

Ответы [ 4 ]

0 голосов
/ 08 июня 2018

Не забудьте класс executor, это правильный пример:

 auth.createUserWithEmailAndPassword(email, password)
                    .addOnCompleteListener(SignupActivity.this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            Toast.makeText(SignupActivity.this, "createUserWithEmail:onComplete:" + task.isSuccessful(), Toast.LENGTH_SHORT).show();
                            progressBar.setVisibility(View.GONE);
                            // If sign in fails, display a message to the user. If sign in succeeds
                            // the auth state listener will be notified and logic to handle the
                            // signed in user can be handled in the listener.
                            if (!task.isSuccessful()) {
                                Toast.makeText(SignupActivity.this, "Authentication failed." + task.getException(),
                                        Toast.LENGTH_SHORT).show();
                            } else {
                                startActivity(new Intent(SignupActivity.this, MainActivity.class));
                                finish();
                            }
                        }
                    });

        }
    });
}   
0 голосов
/ 08 июня 2018

Вам не нужен слушатель события value, для которого вы можете напрямую добавить базу данных следующим образом:

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("users");
databaseReference.push().setValue(users);

, и вам нужно позвонить finish(); после вызова базы данных

0 голосов
/ 08 июня 2018

Запустите Activity и вызовите finish () после установки значения в Database, как предложил @Rohit.

Еще одно предложение;если вы хотите сохранить данные, используя UID, вам нужно будет установить их в ссылочном пути, как показано ниже:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users");

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
if (user != null) {
    String UID = user.getUid(); //get UID of currently logged in user(new user in your case)

    ref.child(UID).setValue(users); //this will give you expected structure
    startActivity(new Intent(SignUpActivity.this, ProfileActivity.class));
    finish();
}
0 голосов
/ 08 июня 2018

вы завершаете действие, прежде чем оно сможет записать в базу данных при вызове

finish();

метод

запустить намерение, как только данные были записаны в базу данных, т.е. после

  ref.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        getValues();
                        ref.child(""+ user +"").setValue(users);
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
startActivity(new Intent(SignUpActivity.this, ProfileActivity.class));
finish();

нравится

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...