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

3

我使用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);

我的数据库长这样:

users
    (auto-generated push token ID)
        fullname
        username
        gender
        ...

我不确定这是否是正确的方法,但我使用push()方法将用户对象添加到数据库中,并且该方法会生成类似于上面的推送令牌ID。
因此,为了避免创建重复的用户,我应该对上述解决方案进行哪些更改?是否有更好的方法来解决这个问题?也许像使用一些Firebase身份验证方法检查Firebase uid?
更新:
我的数据库截图: database 如您所见,“users”下面的字符串与用户的uid不同。

你得到了null,因为你没有一个名为Nick123的子元素child("Nick123");,正如我在答案的第二部分所解释的那样。既然你使用的是randomid而不是userid,那么请检查我的答案的第一部分。 - Peter Haddad
2个回答

5
如果您有这个数据库:
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);

首先,如果你有小写字母的users,那么在子元素中添加users,然后你需要使用查询来检查全名是否等于Nick123。


通常数据库的结构如下:

users
  userId
     fullname: Nick123

属性是键:值,键是标识符,而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(){...}

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);

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

我已经实现了Firebase身份验证,但我需要存储一些额外的用户信息。因此,我将用户详细信息保存到数据库中。因此,使用您的解决方案仍然会得到null值的快照。 - ninbit
null是什么,它总是null,因为您正在使用推送ID作为唯一标识符,而不是Firebase身份验证提供的ID,就像我在我的答案中建议的那样,对吗? - Alex Mamo
基本上你应该使用 child(uid) 而不是 push() 方法。基本上你应该用 child(uid) 替换 push(),对吧?如果不行,请添加你正在使用的将用户添加到数据库的代码,我会向你展示如何操作,好吗? - Alex Mamo
@ninbit的child()方法会在你的树形结构中添加一个新的子节点,所以欢迎使用并加油! - Alex Mamo
1
@AndréKool 好的,没问题。我刚刚更新了我的答案,添加了这些信息以便更好地理解。谢谢 André! - Alex Mamo
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接