如何搜索给定的firebase数据库中是否存在用户名?

Shu*_*han 4 android firebase firebase-realtime-database

{
 users:
  {
    apple:
     {
       username :  apple
       email    :  apple@xy.com
       uid      :  tyutyutyu
     }
    mango:
     {
       username :  mango
       email    :  mango@xy.com
       uid      :  erererer
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果checkUsername方法返回0,这就是我正在创建的CREATING USER

 if(checkFirebaseForUsername(username)==0) {

                    mAuth.createUserWithEmailAndPassword(email, password)
                            .addOnCompleteListener(SignUpActivity.this, new OnCompleteListener<AuthResult>() {
                                @Override
                                public void onComplete(@NonNull Task<AuthResult> task) {
                                    if (task.isSuccessful()) {

                                        Toast.makeText(getBaseContext(),"inside",Toast.LENGTH_LONG).show();
                                        User newUser = new User();
                                        newUser.setUserId(mAuth.getCurrentUser().getUid());
                                        newUser.setUsername(username);
                                        newUser.setEmailId(email);

                                        try{
                                            mRef.child("users").child(username).setValue(newUser);
                                        }
                                        catch(Exception e){
                                            Toast.makeText(SignUpActivity.this,"error while inserting",Toast.LENGTH_LONG).show();
                                        }
                                        AlertDialog.Builder builder = new AlertDialog.Builder(SignUpActivity.this);
                                        builder.setTitle(R.string.signup_success)
                                                .setPositiveButton(R.string.login_button_label, new DialogInterface.OnClickListener() {

                                                    @Override
                                                    public void onClick(DialogInterface dialogInterface, int i) {

                                                        Intent intent = new Intent(SignUpActivity.this, LoginActivity.class);
                                                        startActivity(intent);
                                                        finish();
                                                    }
                                                });
                                        AlertDialog dialog = builder.create();
                                        dialog.show();
                                    } else {
                                        AlertDialog.Builder builder = new AlertDialog.Builder(SignUpActivity.this);
                                        builder.setTitle(R.string.signup_error_title)
                                                .setPositiveButton(android.R.string.ok, null);
                                        AlertDialog dialog = builder.create();
                                        dialog.show();
                                    }
}
Run Code Online (Sandbox Code Playgroud)

我的checkUsername方法 -

public int checkFirebaseForUsername(String passedUsername){
    final int[] flag = {0};
    final String myPassedUsername = passedUsername;
    Log.e("tag","working now");
    //flag[0]=1;

    DatabaseReference mTest = FirebaseDatabase.getInstance().getReference();

       mTest.child("users").child(passedUsername).addChildEventListener(new ChildEventListener() {

        @Override
        public void onDataChanged(DataSnapshot dataSnapshot) {
            Log.e("tag","checking");

            if(dataSnapshot.exists()){
                Log.e("tag","exists");
                flag[0]=1;
               }
         }
        @Override
        public void onCancelled(DataSnapshot datasnapshot){

         }
});




    if(flag[0]==1)
        return 1;
    else
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

这就是我在firebase-database中插入用户的方式,我想检查用户是否可以使用新用户.

因此,我需要检查是否有任何用户已经注册了该用户名....请帮助我已经尝试过任何我能理解的东西后,在官方firebase博客上提供的文档,但都是徒劳的!

Lin*_*nxy 5

编辑:新的答案,旧的仍然在下面.

我会摆脱你的方法,"checkFirebaseForUsername"因为它总是会返回0,无论如何.

你需要做的是:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
ref.child("users").child("username").addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
     if(dataSnapshot.exists()){
      // use "username" already exists
      // Let the user know he needs to pick another username.
    } else {
      // User does not exist. NOW call createUserWithEmailAndPassword
      mAuth.createUserWithPassword(...);
      // Your previous code here.

    }                               
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {

  }
});
Run Code Online (Sandbox Code Playgroud)

旧答案:

{
 users:
  {
    apple[X]:
     {
       username :  apple[Y]
       email    :  apple@xy.com
       uid      :  tyutyutyu
     }
    mango:
     {
       username :  mango
       email    :  mango@xy.com
       uid      :  erererer
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

例如,节点apple [X]将始终与子属性"username":apple [Y]具有相同的名称,那么它就像这样简单.

DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
ref.child("users").child("username").addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
     if(dataSnapshot.exists()){
      // use "username" already exists
    } else {
      // "username" does not exist yet.
    }                               
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {

  }
});
Run Code Online (Sandbox Code Playgroud)

但是,如果说,节点apple [X]可以具有与属性apple [Y]不同的值,并且您想要查看是否存在"username"属性相同的任何节点,那么您将需要执行查询.

 Query query = FirebaseDatabase.getInstance().getReference().child("users").orderByChild("username").equalTo("usernameToCheckIfExists");
 query.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.getChildrenCount() > 0) {
            // 1 or more users exist which have the username property "usernameToCheckIfExists"
         }
       }

      @Override
      public void onCancelled(DatabaseError databaseError) {

      }
  });
Run Code Online (Sandbox Code Playgroud)