#java #android #firebase #firebase-realtime-database
#java #Android #firebase #firebase-realtime-database
Вопрос:
Это возвращает, существует ли пользователь или нет, только когда уже зарегистрировано электронное письмо, если я использую другое электронное письмо, процесс все еще продолжается, я думаю, что я неправильно использую возвращаемое значение.
Это сохраняется, только если электронное письмо зарегистрировано. Если я использовал другое электронное письмо, это не остановит процесс.
private void checkUsername() {
final String Username = editTextUsername.getText().toString().trim();
//Check early for the username length
if (!TextUtils.isEmpty(Username)) {
DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users").getRef();
final Query UsernameReference = mDatabaseReference.orderByChild("Username").equalTo(Username);
ValueEventListener UsernameValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String usernameExist = dataSnapshot.getValue(String.class);
//If the username not null
if (usernameExist != null) {
//If username exist
if (usernameExist.equals(Username)) {
editTextUsername.setError("username taken");
editTextUsername.requestFocus();
} else {
//If not exist, proceed here, which mean success
//Change to your edit text
String email = null;
String password = null;
createAcc(email, password, Username);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
UsernameReference.addListenerForSingleValueEvent(UsernameValueEventListener);
} else {
editTextUsername.setError("Username too short");
editTextUsername.requestFocus();
}
final String email = (editTextEmail).getText().toString().trim();
final String password = editTextPassword.getText().toString().trim();
//validate email
if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
editTextEmail.setError("please enter a valid email address");
return;
}
if (TextUtils.isEmpty(Username)) {
editTextUsername.setError("username required");
return;
}
if (!PASSWORD_PATTERN.matcher(password).matches()) {
editTextPassword.setError("password must contain an uppercase, a special character, and numbers");
return;
}
if (TextUtils.isEmpty(password)) {
editTextPassword.setError("password required");
return;
}
if (TextUtils.isEmpty(email)) {
editTextEmail.setError("email required");
return;
}
if (Username.length() < 5) {
editTextUsername.setError("Username too short");
}
}
private void createAcc(final String email, String password, final String Username) {
progressDialog.setMessage("Registering...");
progressDialog.show();
//creating a new user
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
//checking if success
if (task.isSuccessful()) {
//Uid
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
User user = new User(
Username,
email);
FirebaseDatabase.getInstance().getReference("Users")
.child(uid).setValue(user);
finish();
startActivity(new Intent(SignUpActivity.this, AgeDetailsActivity.class));
} else {
//display some message here
editTextEmail.setError("Email already exists");
}
progressDialog.dismiss();
}
});
}
@Override
public void onClick(View view) {
if (view == buttonSignup) {
checkUsername();
}
Комментарии:
1. Мне трудно понять. Можете ли вы объяснить более подробно один за другим?
2. итак, первая часть такова: TextUtils username string проверяет, является ли имя пользователя пустым или оно совпадает с базой данных Firebase, если оно совпадает, оно должно выдать ошибку, часть выборки выполняется, как вы можете видеть, но не возвращает ошибку, она сразу переходит к регистрации нового имени пользователя с другим адресом электронной почты, тогда и только тогда, когда проверка строки завершена, она должна перейти к createUserWithEmailAndPassword , но игнорирует строку проверьте и создайте имя пользователя с дублирующейся записью.
3. Итак, вы помещаете текстовые файлы в onCreate?
4. я отредактировал это и разместил здесь весь метод, кажется, в методе все в порядке, но он по-прежнему не возвращает значение.
Ответ №1:
Я бы хотел, чтобы вы предпочли что-то подобное, попробуйте это.
private void checkUsername(final String Username) {
//Check early for the username length
if (!TextUtils.isEmpty(Username) amp;amp; Username.length() < 5) {
DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
final Query UsernameReference = mDatabaseReference.orderByChild("Username").equalTo(Username);
UsernameReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String usernameExist = dataSnapshot.child("Username").getValue(String.class);
//If the username not null
if (usernameExist != null) {
//If username exist
if (usernameExist.equals(Username)) {
editTextUsername.setError("username taken");
editTextUsername.requestFocus();
} else {
//If not exist, proceed here, which mean success
//Change to your edit text
String email = null;
String password = null;
createAcc(email, password, Username);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
} else {
editTextUsername.setError("Username too short");
editTextSekolah.requestFocus();
}
}
private void createAcc(final String email, String password, final String Username) {
progressDialog.setMessage("Registering...");
progressDialog.show();
//creating a new user
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
//checking if success
if (task.isSuccessful()) {
//Uid
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
User user = new User(
Username,
email);
FirebaseDatabase.getInstance().getReference("Users")
.child(uid).setValue(user);
finish();
startActivity(new Intent(SignUpActivity.this, AgeDetailsActivity.class));
} else {
//display some message here
editTextEmail.setError("Email already exists");
}
progressDialog.dismiss();
}
});
}
}
Комментарии:
1. это не работает, и я вставил весь метод целиком.
2. в процессе выполнения это просто … com.google. firebase.database. Исключение DatabaseException: не удалось преобразовать значение типа java.util. HashMap в строку
3. во-первых, имя пользователя > 5 всегда имеет значение true, поэтому удалил это и проверил, тогда в этой строке отображается строка ошибки usernameExist = DataSnapshot.GetValue(String.class); здесь.
4. @SunnySpilner на самом деле я написал код
username < 5
. можете ли вы проверить, каково значение для datasnapshot? поступая следующим образом.String usernameExist = String.valueOf(dataSnapshot.getValue(String.class));
. и добавьте новую строку.Toast.makeText(this, "username: " usernameExist , Toast.LENGTH_SHORT).show;
. посмотрите, что произойдет.5. Имя пользователя существует! = null, всегда равно null, также это выдает мне ту же ошибку при компиляции. «не удалось преобразовать значение типа java.util. HashMap в строку »