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