【问题标题】:Checking if a user already exists at firebase realtime database检查用户是否已存在于 firebase 实时数据库中
【发布时间】:2019-01-17 06:15:49
【问题描述】:

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

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 auth 方法检查 firebase uid?

更新 我的数据库截图: 如您所见,“用户”下方的字符串与用户的 uid 不同。

【问题讨论】:

  • 你得到 null 因为你没有一个叫 Nick123 child("Nick123"); 的孩子,正如我在答案的第二部分中解释的那样。由于您使用的是 randomid 而不是 userid,因此请检查我的答案的第一部分。

标签: java android firebase firebase-realtime-database


【解决方案1】:

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

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 并且始终是null,因为您使用推送的ID 作为唯一的itenfier,而不是我在回答中建议您的Firebase 身份验证提供的ID,对吗?
  • 孩子是users 而不是Users。查看大写 U 与小写 u?
  • @AndréKool 好的,没关系。刚刚通过添加此信息来更新我的答案以便更好地理解。谢谢安德烈!
【解决方案2】:

如果你有这个数据库:

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小写字母,然后在child里面添加users,那么你需要使用查询来检查全名是否等于Nick123。


通常数据库的结构是这样的:

users
  userId
     fullname: Nick123

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-13
    • 2021-12-19
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多