通过子节点(firebase)进行搜索,检查用户名是否存在?

时间:2019-03-30 19:12:33

标签: android firebase firebase-realtime-database

我正在创建一个具有注册活动的android应用程序,无法将数据添加到我的firebase数据库中,但是在查询现有数据时遇到了麻烦。基本上,我试图做一个简单的用户名搜索,以敬酒用户,通知他们该用户名已经存在(这样他们就可以创建一个唯一的用户名),这肯定是我犯了一个简单的错误。我创建了一个单独的节点,该节点只是现有的用户名(不确定这是否明智)。即使用户名存在,我的代码仍会添加用户。在这方面的任何帮助将是令人敬畏的!谢谢大家!

我尝试使用dataSnapshot.exists并与节点等一起玩(如我之前提到的添加单独的用户名节点)

{
  "all usernames" : {
       "-LbEvUXcT9Mc3V7awfBz" : "qwerty",
       "-LbEwLUAwQsnlwFeya5o" : "ted"
   },
   "users" : {
       "CgnIejgGw0QvNAGbY5LWx6o17Us1" : {
            "userEmail" : "ted@gmail.com",
             "userName" : "ted"
     }
   }
 }

如果我的图像没有显示我的节点设置,如上所示:

username = etUsername.getText().toString();

    myRef.child("users").child("userName").equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            if(dataSnapshot.exists()){
                Toast.makeText(getContext(),"username Exists",Toast.LENGTH_LONG).show();

            } else {

                FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
                DatabaseReference myRef = firebaseDatabase.getReference();

                String userId = mAuth.getUid();

                userEmail = etEmail.getText().toString();
                username = etUsername.getText().toString();


                UserProfile userProfile = new UserProfile(username, userEmail);

                myRef.child("users").child(userId).setValue(userProfile);
                myRef.child("all usernames").push().setValue(username);
                createUser();

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });[database structure][1]





[1]: https://i.stack.imgur.com/Xjfq5.png

2 个答案:

答案 0 :(得分:0)

将您的代码更新为:

myRef.child("users").child("userName").child(username).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapShot.getValue(String.class) ==null)
              {
                    //username doesn't exist
                    //do something 
              }
            else
              {
                     //username exist
                    //do something
              }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }

});

此外,我认为您应该将数据库结构更改为

username:{
      billy:true,
      name2:true
   }

为了存储多个用户名,因为在当前情况下,您将覆盖该值。

答案 1 :(得分:0)

要过滤某个属性,您首先需要对其进行排序。您正在尝试通过以下方式做到这一点:

myRef.child("users").child("userName")

但这实际上翻译为/users/userName,不存在。

要在/users属性的userName下对每个子节点排序(然后对其进行过滤),您需要:

myRef.child("users").orderByChild("userName").equalTo(username)