#android #firebase #firebase-realtime-database
#Android #firebase #firebase-база данных в реальном времени
Вопрос:
Я использую firebase, и мне нужно проверить, существует ли имя пользователя, я использую Query
для проверки всех имен пользователей, и если я нашел то же имя пользователя, оно не будет продолжать создавать учетную запись. но по какой-то причине Query
выполняется, хотя я могу в отладчике, что он вводит запрос, возможно, запрос выполняется в конце или что-то в этом роде, а не в порядке кода.
Надеюсь, вы сможете мне помочь, вот фрагмент моего кода:
кстати, фрагмент находится в AlertDialog, если это имеет значение.
btnCreate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
errorFlag = 0;
txtNote = (TextView) view.findViewById(R.id.note);
txtEmailReg = (EditText) view.findViewById(R.id.txtEmailReg);
txtPassReg = (EditText) view.findViewById(R.id.txtPassReg);
txtRepassReg = (EditText) view.findViewById(R.id.txtRepassReg);
txtUsernameReg = (EditText) view.findViewById(R.id.txtUsername);
final ArrayList<String> Users = new ArrayList<String>();
Query query = mDatabaseReference.child("users").orderByKey();
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
String userName = snapshot.getValue((User.class)).username;
Users.add(new String(userName));
}
if (Users.size() > 0) {
for (int i = 0; i < Users.size(); i ) {
if (txtUsernameReg.getText().toString().equals(Users.get(i))) {
Toast.makeText(LoginActivity.this, "username exists", Toast.LENGTH_SHORT);
errorFlag = 1;
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
if (errorFlag == 0) {
if (txtRepassReg.getText().toString().length() == 0 || txtEmailReg.getText().toString().length() == 0 || txtPassReg.getText().toString().length() == 0
|| txtUsernameReg.getText().toString().length() == 0) {
errorFlag = 1;
txtNote.setText("one empty field");
}
if (!(txtRepassReg.getText().toString().equals(txtPassReg.getText().toString()))) {
errorFlag = 1;
txtNote.setText("password doesn't match");
}
if (errorFlag == 0) {
CreateAcc(txtEmailReg.getText().toString(), txtPassReg.getText().toString(), dialog,
txtUsernameReg.getText().toString());
}
}
}
});
Комментарии:
1. Из того, что я знаю о firebase, он работает с моделью подписки на основе событий для данных, поэтому перед тем, как запрос получит ответ (что происходит асинхронно), достигается блок if, и к тому времени значение errorFlag не изменилось.
2. Сохраняете ли вы имена пользователей для успешно зарегистрированных пользователей в базе данных firebase? Если да, то я могу предложить вам код, который работает, поскольку я также сделал то же самое в своем проекте firebase.
3. @IshanKhanna, как вы описали, так что я могу сделать, чтобы это исправить?