【问题标题】:exist in Firebase database user name存在于 Firebase 数据库用户名中
【发布时间】:2018-05-13 09:38:53
【问题描述】:

我正在尝试在 firebase 数据库中搜索“用户名”,但它总是返回 else 语句

mDatabaseref = FirebaseDatabase.getInstance().getReference("user_info");

mDatabaseref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.child("username").child(usernamedatabasesend).exists())
        {
            Log.i("USERINFO","USER EXISTS");
        }
        else
        {
            Log.i("USERINFO","USER DOES NOT EXISTS");
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

mDatabaseref = FirebaseDatabase.getInstance().getReference("user_info");
mDatabaseref.push().setValue(uic);

usernamedatabasesend 是 Edittext 值,用于将其发送到数据库以检查用户输入的相同值是否存在于数据库中

Database节点是这样的

"user_info" : {
    "-L-7QPKXFyoN-GlPxTTN" : {
      "email" : "",
      "name" : "",
      "password" : "",
      "username" : "ujjwalbassi"
    },
    "-L-7QPMyzXCqpWT0YLPM" : {
      "email" : "",
      "name" : "",
      "password" : "",
      "username" : "ujjwalbassi"
    }
}

****更新*********

这是新代码

mDatabaseref.orderByChild("username").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
        {
            userInfo userinfoclass = dataSnapshot1.getValue(userInfo.class);

            String usernamegotunamn = userinfoclass.getUsername().toString();

            if(usernamegotunamn.equals(usernamedatabasesend))
            {
                Log.i("YESONO","USEREXISTS"+"\n"+usernamegotunamn+"\n"+usernamedatabasesend);
            }

            else {
                mDatabaseref.push().setValue(uic);

                Log.i("YESONO", "USERDOESNOTEXIST");
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

if else 有效,但如果“IF”为真,那么 else 也适用。但它显示用户是否存在。

【问题讨论】:

    标签: android database firebase firebase-realtime-database


    【解决方案1】:

    试试这个。

    mDatabaseref.orderByChild("username").equalTo("ujjwalbassi").addListenerForSingleValueEvent(
        new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                //data will be available on dataSnapshot.getValue();
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.w(TAG, "getUser:onCancelled", databaseError.toException());
            }
    });
    

    参考:How to Search for data in Firebase Android

    【讨论】:

    • 这就像一个魅力。非常感谢!现在我真正了解了这个 firebase 值监听器是如何工作的。
    【解决方案2】:

    您不能使用exists() 方法来检查值是否存在。如果你想使用exists() 方法,那么你应该考虑稍微改变你的数据库结构。无需将 push() 方法生成的 id 作为唯一标识符,只需使用用户名即可。您的数据库结构应如下所示:

    "user_info" : {
        "ujjwalbassi" : {
          "email" : "",
          "name" : "",
          "password" : "",
        },
        "anotherUserName" : {
          "email" : "",
          "name" : "",
          "password" : "",
        }
    }
    

    这里重要的是,当您向数据库添加新用户以检查用户名的唯一性时。要验证用户是否存在,可以使用以下代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference userNameRef = rootRef.child("user_info").child(usernamedatabasesend);
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()) {
                //do something
            } else {
                //do something else
            }
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    userNameRef.addListenerForSingleValueEvent(eventListener);
    

    另一种方法是在usernamedatabasesend 之后过滤数据库并获取具有相同用户名的所有用户。这不是一个好习惯,让您的数据库中的用户具有相同的用户名。如果你想这样做,你可以在这样的查询中使用orderByChild() 方法:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    Query userNameQuery = rootRef.child("user_info").orderByChild("username").equalTo(usernamedatabasesend);
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()) {
                //do something
            } else {
                //do something else
            }
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    userNameQuery.addListenerForSingleValueEvent(eventListener);
    

    如果用户名包含一个点.,那么您需要对其进行编码以便将其用作数据库中的键。要对用户名进行编码,请使用以下方法:

    static String encodeUserName(String userName) {
        return userName.replace(".", ",");
    }
    

    要找回它,请使用以下代码:

    static String decodeUserName(String userName) {
        return userName.replace(",", ".");
    }
    

    【讨论】:

    • 如果我按照你说的那样创建数据库,用户名就像带有点“。”的“ujjwal.bassi”。并且firebase给出了一个错误,因为它不能包含点“。”和更多特定的符号
    • 所以 "user_info" : { "-L-7QPKXFyoN-GlPxTTN" : { "email" : "", "name" : "", "password" : "", "username" : “ujjwalbassi”},“-L-7QPMyzXCqpWT0YLPM”:{“电子邮件”:“”,“名称”:“”,“密码”:“”,“用户名”:“ujjwalbassi”}}
    • com.google.firebase.database.DatabaseException:Firebase 数据库路径无效:ujjwal.bassi。 Firebase 数据库路径不得包含“.”、“#”、“$”、“[”或“]”
    • 是的,对可能在用户名中的每个符号执行相同的操作,这是被禁止的。
    • .replace 是(目标,替换);所以毕竟我替换了用户名中也被禁止的“。”(点“),”,“(逗号)。
    【解决方案3】:

    要通过循环检查用户是否存在,您需要遍历每个DataSnapshot 并查看用户名是否匹配。为此,您需要首先获取所有用户的DataSnapshot,然后遍历每个用户:

    mDatabaseref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot user : dataSnapshot){  
                if(user.child("username").getValue(String.class).equals(usernamedatabasesend)){
                    //The username matches!
                    Log.i("USERINFO","USER EXISTS");
                    return
                }
            }
        }
        @Override public void onCancelled(DatabaseError databaseError) {}
    });
    

    这不是最佳做法(如果您有大量用户,会变慢),但它绝对是一个可行的解决方案。我建议使用@lovekush-vishwakarma 的答案作为更快的解决方案。

    【讨论】:

    • 是的,所以检索整个 user_info 节点会使应用程序变慢,并且数据库/互联网工作得更多。
    • @UjjwalBassi 你是对的。这就是为什么我在正确解决您遇到的特定问题后提到其他人的答案。祝你的项目好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多