我正在使用Firebase进行身份验证,并且在“注册活动”中,我要检查用户名是否已从结构如下的数据库中获取:
Users
|
|
|
----userID
|-----"username"="exampleusername"
我的代码可以识别用户名是否已被使用,并返回Toast消息并且不创建用户,问题是如果用户名未被使用,它还会显示此消息,但是帐户已创建。有人知道我在做什么错吗?
public class SignUpActivity extends AppCompatActivity {
private EditText emailTV, passwordTV, usernameTV, fullnameTV;
private ImageButton regBtn;
private ProgressBar progressBar;
private FirebaseAuth mAuth;
private static FirebaseAnalytics firebaseAnalytics;
DatabaseReference reference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_up);
mAuth = FirebaseAuth.getInstance();
initializeUI();
regBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
usernamecheck();
}
});
final TextView signup_button = findViewById(R.id.back_button);
signup_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SignUpActivity.this, LoginActivity.class);
startActivity(intent);
}
});
}
private void usernamecheck() {
String username;
username = usernameTV.getText().toString();
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Users");
ref.orderByChild("username").equalTo(username).addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot){
if(!dataSnapshot.exists()) {
registerNewUser();
return;
}
else{
userexists();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void userexists(){
Toast.makeText(getApplicationContext(), getString(R.string.usernameexists), Toast.LENGTH_LONG).show();
}
private void registerNewUser() {
progressBar.setVisibility(View.VISIBLE);
String email, password, username, fullname;
fullname = fullnameTV.getText().toString();
email = emailTV.getText().toString();
password = passwordTV.getText().toString();
username = usernameTV.getText().toString();
if (TextUtils.isEmpty(fullname)) {
Toast.makeText(getApplicationContext(), getString(R.string.missingfullname), Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
return;
}
if (TextUtils.isEmpty(username)) {
Toast.makeText(getApplicationContext(), getString(R.string.missingusername), Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
return;
}
if (TextUtils.isEmpty(email)) {
Toast.makeText(getApplicationContext(), getString(R.string.missingmail), Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
return;
}
if (TextUtils.isEmpty(password)) {
Toast.makeText(getApplicationContext(), getString(R.string.missingpassword), Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
return;
}
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String userid = user.getUid();
reference = FirebaseDatabase.getInstance().getReference().child("Users").child(userid);
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("id", userid);
hashMap.put("username", username.toLowerCase());
hashMap.put("fullname", fullname);
hashMap.put("bio", "");
hashMap.put("imageurl", "https://firebasestorage.googleapis.com/v0/b/frooze-b2248.appspot.com/o/default.png?alt=media&token=aaf52a37-7043-4685-b91f-c6cccda88f4e");
reference.setValue(hashMap).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
// Verification Mail
sendVerificationEmail();
FirebaseAuth.getInstance().signOut();
progressBar.setVisibility(View.GONE);
Intent intent = new Intent(SignUpActivity.this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
});
}
else {
// If registration fails
Toast.makeText(getApplicationContext(), getString(R.string.registrationfail), Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
}
}
});
}
public void sendVerificationEmail() {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
// if User logged in
if (user != null) {
// Sends verify Mail
user.sendEmailVerification()
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Toast.makeText(getApplicationContext(), getString(R.string.registrationsuccessful), Toast.LENGTH_LONG).show();
}
}
});
}
}
private void initializeUI() {
fullnameTV = findViewById(R.id.fullname);
emailTV = findViewById(R.id.email);
usernameTV = findViewById(R.id.username);
passwordTV = findViewById(R.id.password);
regBtn = findViewById(R.id.register);
progressBar = findViewById(R.id.progressBar);
}
}
谢谢。
答案 0 :(得分:2)
您正在使用addValueEventListener
和onDataChange
,这意味着当添加或更改变量时,将执行侦听器。 addValueEventListener
继续监听附加的查询或数据库引用。
如果只想一次,则必须使用其他侦听器。另一个侦听器是addListenerForSingleValueEvent
,该侦听器执行一次onDataChange
方法,然后停止侦听附加到该引用的引用。