【问题标题】:DatabaseSnapshot executes both if and elseDatabaseSnapshot 同时执行 if 和 else
【发布时间】:2020-06-26 17:36:00
【问题描述】:

我正在使用 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);
    }
}

谢谢。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您正在使用addValueEventListeneronDataChange,这意味着当添加或更改变量时,将执行该侦听器。 addValueEventListener 一直在监听附加的查询或数据库引用。

    如果你想要一个单一的,你必须使用不同的监听器。另一个侦听器是addListenerForSingleValueEvent,它执行一次onDataChange 方法,然后停止侦听它所附加到的引用。

    【讨论】:

    • 非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多