首页 > 解决方案 > Firebase 的 exists() 函数行为突然

问题描述

在此处输入图像描述在此处输入图像描述

我使用exists()快照对象的方法Firebase来检查用户是否在按下SignUp(register)按钮时存在。但是只要我按下按钮,if 和 else 条件都会被执行(else first)。出了什么问题?

    final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("users");

    register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            databaseReference.addValueEventListener(new ValueEventListener() {
                public static final String TAG = "user_REG";

                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if(dataSnapshot.child(mobileNumber.getText().toString()).exists()){
                        Log.d(TAG, "onDataChange: if fired");
                    } else {
                        Log.d(TAG, "onDataChange: else fired");
                        if(confirmPass.getText().toString().trim().equals(userPass.getText().toString().trim())){
                            userModel userModel = new userModel(fullName.getText().toString(), userPass.getText().toString());
                            databaseReference.child(mobileNumber.getText().toString()).setValue(userModel);
                            Toast.makeText(user_reg.this, "Successfully Signed Up", Toast.LENGTH_SHORT).show();
                            finish();
                        } else {
                            Toast.makeText(user_reg.this, "Your Passwords do not match", Toast.LENGTH_SHORT).show();
                        }
                    }
                }

标签: androidfirebase

解决方案


第一次mobileNumber不存在,所以执行 else 部分并添加子节点值,并且在同一节点下添加数据时,onDataChange将再次触发,这一次if将执行部分。

为了防止onDataChange调用两次,使用SingleEventListener而不是ValueEventListener像这样

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot dataSnapshot) {
       String value = (String) dataSnapshot.getValue();
       // do your stuff here with value
   }
   @Override
   public void onCancelled(FirebaseError firebaseError) {
   }
});

推荐阅读