Java 检查firebase实时数据库中是否已存在用户

Java 检查firebase实时数据库中是否已存在用户,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我获取快照以检查数据库中是否存在唯一值,但快照始终为null。解决方案如下: DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference userNameRef = rootRef.child("Users").child("Nick123"); ValueEventListener eventListener = new ValueEventListener() { @

我获取快照以检查数据库中是否存在唯一值,但快照始终为null。解决方案如下:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userNameRef = rootRef.child("Users").child("Nick123");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    if(!dataSnapshot.exists()) {
        //create new user
    }
}

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
userNameRef.addListenerForSingleValueEvent(eventListener);
我的数据库如下所示:

users
    (auto-generated push token ID)
        fullname
        username
        gender
        ...
users
  userId
     fullname: Nick123
我不知道这是否是正确的方法,但我使用push()方法将用户对象添加到数据库中,该方法生成了如上所述的推令牌ID

因此,为了不创建重复用户,我应该对上述解决方案做哪些更改?有没有更好的方法?也许想用一些firebase身份验证方法检查firebase uid

更新 我的数据库截图:
正如您所看到的,“users”下面的字符串与用户的uid不同

如果您有此数据库:

users
(auto-generated push token ID)
    fullname
    username
    gender
然后,要检查用户是否存在,您需要执行以下操作:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userNameRef = rootRef.child("users");
Query queries=userNameRef.orderByChild("fullname").equalTo("Nick123");
ValueEventListener eventListener = new ValueEventListener() {
  @Override
public void onDataChange(DataSnapshot dataSnapshot) {
   if(!dataSnapshot.exists()) {
       //create new user
    }
 }

    @Override
   public void onCancelled(DatabaseError databaseError) {}
};
queries.addListenerForSingleValueEvent(eventListener);
首先,如果您有
用户
小写字母,然后在子项中添加
用户
,那么您需要使用查询来检查全名是否等于Nick123


数据库的结构通常如下所示:

users
    (auto-generated push token ID)
        fullname
        username
        gender
        ...
users
  userId
     fullname: Nick123
属性是
key:value
,key是标识符,Nick123是值,因此在
child()
方法中,您需要写入标识符
fullname
,而不是Nick123

然后,由于您可以获取用户ID,因此可以执行以下操作:

FirebaseUser currentFirebaseUser =FirebaseAuth.getInstance().getCurrentUser();
String userId=currentFirebaseUser.getUid();
 DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userNameRef = rootRef.child("users").child(uid).child("fullname");
userNameRef.addValueEventListener(new ValueEventListener(){...}

在将用户详细信息保存到数据库中时,这不是最佳做法。首先,您应该实现,然后为了检查数据库中是否存在用户,您应该使用以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    if(!dataSnapshot.exists()) {
        //create new user
    }
}

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(eventListener);

因此,解决这个问题的关键是调用
child()
方法,并将
uid
作为参数传递,而不是调用生成随机唯一标识符的
push()
方法。

由于没有名为Nick123
child(“Nick123”)的子级,因此会得到null正如我在回答的第二部分所解释的。由于您使用的是randomid而不是userid,请检查我答案的第一部分。我已经实现了firebase身份验证,但我需要存储一些额外的用户信息。因此,我将用户详细信息保存到数据库中。因此,使用您的解决方案,快照仍然为空。我添加了我数据库的屏幕截图是
null
,并且它始终为
null
,因为您使用的是唯一的ITE,用于输入推送id,而不是我在回答中建议您的Firebase身份验证提供的id,对吗?而且孩子是
用户
而不是
用户
。参见大写字母
U
vs小写字母
U
?@AndréKool好的。刚刚更新了我的答案,添加了这些信息以便更好地理解。谢谢安德烈!