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

nin*_*bit 3 java android firebase firebase-realtime-database

我得到了Alex Mamo 的解决方案,以检查我的数据库中是否存在唯一值,但快照始终为空。解决方案在这里:

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);
Run Code Online (Sandbox Code Playgroud)

我的数据库如下所示:

users
    (auto-generated push token ID)
        fullname
        username
        gender
        ...
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是正确的方法,但我使用了 push() 方法将用户对象添加到数据库中,并且此方法会像上面一样生成推送令牌 ID。

那么,为了不创建重复的用户,我应该对上述解决方案进行哪些更改?有更好的方法来做到这一点吗?也许就像使用一些 firebase auth 方法检查 firebase uid 一样?

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

Pet*_*dad 5

如果你有这个数据库:

users
(auto-generated push token ID)
    fullname
    username
    gender
Run Code Online (Sandbox Code Playgroud)

然后要检查用户是否存在,您需要执行以下操作:

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);
Run Code Online (Sandbox Code Playgroud)

首先,如果您有users小写字母,然后在 child add 中users,那么您需要使用查询来检查全名是否等于 Nick123。


通常数据库的结构如下:

users
  userId
     fullname: Nick123
Run Code Online (Sandbox Code Playgroud)

属性是key:value,键是标识符,Nick123 是值,因此在child()方法中您需要编写标识符,fullname而不是 Nick123。

然后既然你能够获取 userId,你可以这样做:

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(){...}
Run Code Online (Sandbox Code Playgroud)


Ale*_*amo 5

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

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 error) {
        Log.d("TAG",error.getMessage()); //Don't ignore potential errors!
    }
};
uidRef.addListenerForSingleValueEvent(eventListener);
Run Code Online (Sandbox Code Playgroud)

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