【问题标题】:How to check if the particular username exists in the firebase? (Java Android)如何检查特定用户名是否存在于firebase中? (Java 安卓)
【发布时间】:2021-08-24 16:29:59
【问题描述】:

我已经尝试了所有 StackOverflow 方法,但所有方法都在检查它是否为空。 我想检查“用户”节点下的特定字符串。示例: (aaaaa) (bbbbb) 或其中的子值(用户名:“aaaaa”) 如果用户在注册时输入用户名“asaaa”或“bbbbb”会提示错误。 (我想检查firebase所有节点中的所有值) 我已经搜索了整个堆栈溢出,但大多数解决方案都需要知道节点名称才能运行。我想检索“用户”下的所有节点名称以进行检查。 如果用户在注册时使用“aaaaa”作为用户名,TextInputLayout 中会出现 setError。

公共类 RegisterActivity 扩展 AppCompatActivity {

EditText username, fullname, email, password;
Button register;
TextView txt_login;
public String strUsername;

FirebaseAuth auth;
DatabaseReference reference;
ProgressDialog pd;
private static final String TAG = "RegisterActivity";

private static String users_from_database;
private ArrayList<String> username_list = new ArrayList<>();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);

    username = findViewById(R.id.username);
    fullname = findViewById(R.id.fullname);
    email = findViewById(R.id.email);
    password = findViewById(R.id.password);
    register = findViewById(R.id.btn_Register);
    txt_login = findViewById(R.id.txt_login);


    auth = FirebaseAuth.getInstance();

    checkForUsername();

   txt_login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(RegisterActivity.this,HomeActivity.class));
        }
    });

    register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            pd = new ProgressDialog(RegisterActivity.this);
            pd.setMessage("Please wait...");
            pd.show();

            String str_username = username.getText().toString();
            String str_fullname = fullname.getText().toString();
            String str_email = email.getText().toString();
            String str_password = password.getText().toString();

            strUsername = username.getText().toString().trim();

            if (!username_list.contains(strUsername)) {
                // do your job here , suppose send verification code to phone number
                if(TextUtils.isEmpty(str_username) || TextUtils.isEmpty(str_fullname) || TextUtils.isEmpty(str_email) ||
                        TextUtils.isEmpty(str_password)){
                    Toast.makeText(RegisterActivity.this,"All fields are required!",Toast.LENGTH_SHORT).show();
                    pd.dismiss();
                } else if (str_password.length() < 6) {
                    Toast.makeText(RegisterActivity.this,"Password must be over 6 characters.",Toast.LENGTH_SHORT).show();
                    pd.dismiss();
                } else {
                    register(str_username,str_fullname,str_email,str_password);
                }
            } else {
                username.setError("Username Exist");
            }



        }
    });
}
private void checkForUsername(){

    DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Users/");
    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for (DataSnapshot ds : snapshot.getChildren()) {

                users_from_database = (String) ds.child("username").getValue();

                username_list.add(users_from_database);
                StringBuilder stringBuilder = new StringBuilder();
                for (String s : username_list) {
                    stringBuilder.append(s + "\n");
                }
                Log.d("ZI", stringBuilder.toString());

            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Log.d("ZI", "Failed");
        }
    });
}

private void register(final String username, final String fullname, String email, String password){
    auth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(RegisterActivity.this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()){
                        FirebaseUser firebaseUser = auth.getCurrentUser();
                        String userID = firebaseUser.getUid();

                        firebaseUser.sendEmailVerification().addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Toast.makeText(RegisterActivity.this,"Verification Email Has Been Sent.", Toast.LENGTH_SHORT).show();
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.d(TAG, "onFailure: Email not sent" + e.getMessage());
                            }
                        });


          

                        reference = FirebaseDatabase.getInstance().getReference().child("Users").child(username);

                        HashMap<String, Object> hashMap = new HashMap<>();
                        hashMap.put("username",username.toLowerCase());
                        hashMap.put("fullname",fullname);
                        hashMap.put("email",email);
                        hashMap.put("password",password);
                        hashMap.put("imageurl","");

                        reference.setValue(hashMap).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if(task.isSuccessful()){
                                    pd.dismiss();
                                    Intent intent = new Intent(RegisterActivity.this,EmailActivity.class);
                                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(intent);
                                }
                            }
                        });
                    } else {
                        pd.dismiss();
                        Toast.makeText(RegisterActivity.this,"Register Failed",Toast.LENGTH_SHORT).show();
                    }
                }
            });
}

}

pic 2

【问题讨论】:

  • 您可以在此处查看文档示例:Android developers。顺便说一句,如果您的应用程序中的用户未注册,他/她无权从数据库中读取数据,因此您无法检查,也许您应该添加一个屏幕,允许在用户注册后选择用户名登录/登录。

标签: java android firebase firebase-realtime-database snapshot


【解决方案1】:

您可以创建一个公共路径usernames,您只需在其中存储已使用且公开可见的用户名。注册新用户时,您可以检查用户名是否已存在。也不要试图让所有这些来检查是否存在一个。只需调用路径usernames/{username},如果是null,则用户名不存在。阅读所有这些内容会使您的 Firebase 账单付诸东流。

【讨论】:

  • 任何我可以参考的编码示例?
  • 如果数据库中有任何数据,只需检查DatabaseReference ref = FirebaseDatabase.getInstance().getReference("usernames/aaa")
  • 如果我想检查所有的路径名,我只需 .getReference("username/") ???
  • 没有理由得到所有这些。这样做只会花钱,没有任何好处。
【解决方案2】:

我已经搜索了整个堆栈溢出,但大多数解决方案都需要知道节点名称才能运行。

即使在您的示例中,您也可以通过检查数据库中是否存在以下节点来检查用户是否存在:

root/users/$userName

代码应该是这样的:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("Users");
DatabaseReference userNameRef = usersRef.child("aaaaa");
userNameRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            DataSnapshot snapshot = task.getResult();
            if(snapshot.exists()) {
                String fullName = snapshot.child("fullName").getValue(String.class);
                Log.d("TAG", fullName);
            } else {
                Log.d("TAG", "The user doesn't exist!");
            }
        } else {
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

虽然@TarikHuber 回答它会起作用,但请注意,在这种情况下,没有必要创建一个额外的节点来保存所有用户名,因为您的数据库结构已经这样做了。所以在检查用户是否存在方面:

root/users/$userName

与以下内容完全相同:

root/usernames/$userName

由于实时数据库中的节点由键和值对表示,请注意键是唯一的。所以你不可能有重复的节点。因为每个节点都可以被认为是一个地图。

但是,如果偶然在数据库中有多个用户共享相同的用户名,那么您应该使用如下代码行中的查询:

Query queryByUserName = usersRef.orderByChild("username").equalTo("aaaaa");
queryByUserName.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            for (DataSnapshot ds : task.getResult().getChildren()) {
                if(ds.exists()) {
                    String fullName = ds.child("fullName").getValue(String.class);
                    Log.d("TAG", fullName);
                } else {
                    Log.d("TAG", "The user doesn't exist!");
                }
            }
        } else {
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

根据您的屏幕截图,在这两种情况下,logcat 中的结果都是:

james

附:虽然@ZahidIslam 的回答也可能有效,但下载整个“用户”节点并在客户端上执行检查并不是最佳选择,因为它被认为非常昂贵。这是对带宽和资源的浪费。

编辑:

根据你最后的评论:

我想你误解了我的意思。我想搜索 rootNodes 下的所有节点

您无法创建可以在数据库内的所有节点下进行搜索的查询。但是,您可以下载整个数据库并在客户端进行过滤,但这样做成本很高,不推荐。

您拥有的最佳选择是为每个节点创建一个单独的查询,但前提是所有子节点都具有相同的字段。或者您可以仅将用户保留在“用户”节点中(就像您现在所做的那样),并且我的答案中的代码将始终可以正常工作。

【讨论】:

  • 数据库引用 userNameRef = usersRef.child("aaaaa");不仅需要检查“aaaaa”节点。假设“aaaaa”应该是所有节点,甚至“bbbbb”、“ccccc”或其他随机名称将被检查以确保没有节点具有相同的名称。
  • 如果用户在注册时输入特定值,例如“aaaaa”,我的答案中的代码会检查它是否已经存在。如果它存在,它将打印用户名,否则,它将打印一个错误,就像我更新的答案一样,对吧?
  • 请记住,它将检查“用户”节点中的所有记录。现在可以了吗?
  • 但是如果用户输入像“cccccc”这样的随机值呢?它是否检查它是否存在于数据库中? ((DatabaseReference userNameRef = usersRef.child("aaaaa");)) 这只检查“aaaaa”。如果任何可能的答案是我可以变成 ((DatabaseReference userNameRef = usersRef.child(username); )) 但我敢打赌它不起作用。
  • 而且我没有检查全名,而是我不希望 2 个用户使用相同的用户名而不是全名。
【解决方案3】:

是的,您可以按照以下步骤操作。

  1. 从您的 DatabaseReference 中获取所有 username 子级并将其添加到 ArrayList。

  2. 检查用户提供的username 在 ArrayList 中是否可用(从步骤 1)。如果包含则设置错误,否则请完成注册。

更新-我认为您在执行/完成checkForUsername(); 方法之前执行按钮单击以进行注册。所以if...else 语句不能正常工作及其覆盖数据。这是我的错。我们应该先检查数据库中的所有用户,然后再进行下一部分的注册。因此,无需在 onCreate() 中单独使用 checkForUsername() 方法,我们将在 click 按钮中执行所有操作。检查代码 -

       register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            pd = new ProgressDialog(LoginActivity.this);
            pd.setMessage("Please wait...");
            pd.show();

            String str_username = username.getText().toString();
            String str_fullname = fullname.getText().toString();
            String str_email = email.getText().toString();
            String str_password = password.getText().toString();

            strUsername = username.getText().toString().trim();


            DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Users/");
            ref.addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
           public void onDataChange(@NonNull DataSnapshot snapshot) {
            for (DataSnapshot ds : snapshot.getChildren()) {

                users_from_database = (String) ds.child("username").getValue();

                username_list.add(users_from_database);
                StringBuilder stringBuilder = new StringBuilder();
                for (String s : username_list) {
                    stringBuilder.append(s + "\n");
                }
              //  Log.d("ZI", stringBuilder.toString());

                  if (!username_list.contains(strUsername)) {
                    // do your job here , suppose send verification code to phone number
                    if (TextUtils.isEmpty(str_username) || TextUtils.isEmpty(str_fullname) || TextUtils.isEmpty(str_email) ||
                            TextUtils.isEmpty(str_password)) {
                        Toast.makeText(LoginActivity.this, "All fields are required!", Toast.LENGTH_SHORT).show();
                        pd.dismiss();
                    } else if (str_password.length() < 6) {
                        Toast.makeText(LoginActivity.this, "Password must be over 6 characters.", Toast.LENGTH_SHORT).show();
                        pd.dismiss();
                    } else {
                        register(str_username, str_fullname, str_email, str_password);
                    }
                } else {
                    username.setError("Username Exist");
                    pd.dismiss();
                }

            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Log.d("ZI", "Failed");
        }
    });

        }
    });

更新-您可以检查DataSnapshot 是否存在。如果不存在,那么您可以设置测试值来启动您的数据库。这将只执行一次。你可以检查-

       register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            pd = new ProgressDialog(LoginActivity.this);
            pd.setMessage("Please wait...");
            pd.show();

            String str_username = username.getText().toString();
            String str_fullname = fullname.getText().toString();
            String str_email = email.getText().toString();
            String str_password = password.getText().toString();

            strUsername = username.getText().toString().trim();


            DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Users/");
            ref.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {

                    if (!snapshot.exists()) {
                        HashMap<String, Object> testHash = new HashMap<>();
                        testHash.put("username", "testusername");
                        ref.child("test")
                                .setValue(testHash).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    ref.keepSynced(true);
                                    Toast.makeText(LoginActivity.this, "Please try again", Toast.LENGTH_SHORT).show();
                                    pd.dismiss();
                                } else {
                                    Log.d("ZI", "Failed ", task.getException());
                                }
                            }
                        });
                    } else {

                        for (DataSnapshot ds : snapshot.getChildren()) {
                            users_from_database = (String) ds.child("username").getValue();
                            username_list.add(users_from_database);
                            StringBuilder stringBuilder = new StringBuilder();
                            for (String s : username_list) {
                                stringBuilder.append(s + "\n");
                            }
                            Log.d("ZI", stringBuilder.toString());

                            if (!username_list.contains(strUsername)) {
                                // do your job here , suppose send verification code to phone number
                                if (TextUtils.isEmpty(str_username) || TextUtils.isEmpty(str_fullname) || TextUtils.isEmpty(str_email) ||
                                        TextUtils.isEmpty(str_password)) {
                                    Toast.makeText(LoginActivity.this, "All fields are required!", Toast.LENGTH_SHORT).show();
                                    pd.dismiss();
                                } else if (str_password.length() < 6) {
                                    Toast.makeText(LoginActivity.this, "Password must be over 6 characters.", Toast.LENGTH_SHORT).show();
                                    pd.dismiss();
                                } else {
                                    register(str_username, str_fullname, str_email, str_password);
                                }
                            } else {
                                username.setError("Username Exist");
                                pd.dismiss();
                            }

                        }
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                    Log.d("ZI", "Failed");
                }
            });

        }
    });

【讨论】:

  • 这不起作用。数据只是用相同的用户名覆盖以前的数据。
  • 这绝对有效,附上你的代码。
  • 我已经上传了我的代码。它不起作用,它只是用当前数据覆盖现有的用户名。
  • 您附加的代码执行得很好,您的问题是什么?你应该在 setError 之后关闭 ProgressDialogusername.setError("Username Exist"); pd.dismiss();
  • 不工作。进度对话框一直在旋转。
猜你喜欢
  • 1970-01-01
  • 2017-02-17
  • 2019-01-04
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多