Android 存在于Firebase数据库用户名中
我试图在firebase数据库中搜索“用户名”,但它总是返回else语句Android 存在于Firebase数据库用户名中,android,database,firebase,firebase-realtime-database,Android,Database,Firebase,Firebase Realtime Database,我试图在firebase数据库中搜索“用户名”,但它总是返回else语句 mDatabaseref = FirebaseDatabase.getInstance().getReference("user_info"); mDatabaseref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot
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值
数据库节点如下所示
"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也会工作。但是它显示用户是否存在。试试这个
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());
}
});
参考:您不能使用
exists()
方法检查值是否存在。如果你想使用<代码>生存()/代码>方法,那么你应该考虑一下改变你的数据库结构。只需使用用户名,而不用push()方法生成的id作为唯一标识符。您的数据库结构应如下所示:
"user_info" : {
"ujjwalbassi" : {
"email" : "",
"name" : "",
"password" : "",
},
"anotherUserName" : {
"email" : "",
"name" : "",
"password" : "",
}
}
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);
这里重要的一点是,当您向数据库添加新用户以检查用户名的唯一性时。要验证用户是否存在,可以使用以下代码:
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);
static String decodeUserName(String userName) {
return userName.replace(",", ".");
}
另一种方法是在usernamedatabasesend
之后过滤数据库,并获取具有相同用户名的所有用户。如果数据库中的用户具有相同的用户名,这不是一个好的做法。如果要执行此操作,可以在如下查询中使用orderByChild()
方法:
"user_info" : {
"ujjwalbassi" : {
"email" : "",
"name" : "",
"password" : "",
},
"anotherUserName" : {
"email" : "",
"name" : "",
"password" : "",
}
}
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(".", ",");
}
要取回它,请使用以下代码:
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);
static String decodeUserName(String userName) {
return userName.replace(",", ".");
}
要通过循环检查用户是否存在,需要循环检查每个
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的答案作为更快的解决方案。如果我像你说的那样创建数据库,用户名就像带点的“ujjwal.bassi”,而firebase给出了一个错误,因为它不能包含点“.”以及更确定的符号“user_info”:{“-L-7QPKXFyoN-GlPxTTN”:{“email”:“name”:”,“密码”:“用户名”:“ujwalbassi”},“-L-7QPMyzXCqpWT0YLPM”:{“电子邮件”:“姓名”:“密码”:“用户名”:“ujwalbassi”}}}}com.google.firebase.database.DatabaseException:无效的firebase数据库路径:ujwal.bassi。Firebase数据库路径不能包含“.”、“#.”、“$”、“[”或“]”是的,请对用户名内的每个符号执行相同的操作,并且禁止使用。replace是(目标,replacement);所以,毕竟我在替换“.”(点“,”,“(逗号)这在用户名中也是被禁止的。是的,因此检索整个用户信息节点将使应用程序运行缓慢,数据库/互联网工作更加正常。@UjjwalBassi你是对的。这就是为什么我在正确解决了你遇到的具体问题后提到了其他人的答案。祝你的项目好运!这很有魅力。谢谢你太多了!现在我真正了解了firebase价值监听器的工作原理。