首页 > 解决方案 > 通过子节点(firebase)搜索检查用户名是否存在?

问题描述

我正在创建一个带有注册活动的 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

标签: androidfirebasefirebase-realtime-database

解决方案


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

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

但这被直译为/users/userName,并不存在。

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

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

推荐阅读