如何防止Firebase数据库上的用户名重复

时间:2018-12-06 04:06:52

标签: android firebase firebase-realtime-database firebase-authentication

我真的是Firebase的新手。我在这里读过类似的话题,但还是听不懂。

这就是我想要做的:

  • 我正在使用以下方式进行简单的身份验证 电子邮件+密码+用户名。我将用户名存储在数据库中(请参见图片) (https://i.stack.imgur.com/eQxZM.png

我将父键设置为uid,并将键:将值都设置为用户名,原因是我读到,如果这样做,它将不允许使用相同的键,但我不理解,它仍会覆盖键和值

我的Firebase规则设置为true,因为这只是一个示例项目。我希望有一个人可以帮助我。谢谢!

2 个答案:

答案 0 :(得分:0)

您可以添加代码吗?就我而言

databaseReference.child("user_info").child(f_user.getUid()).child("username").setValue(f_user.getUid());

此代码可以防止重复写入。

但是如果您这样设置代码,我的意思是使用push()。

databaseReference.child("user").push().setValue(user);

此代码无法防止重复写入。

答案 1 :(得分:0)

我建议您使数据库结构如下:

rootReference
|
 -- uid1
 |
  - username
 |
  - email
 |
  - other_details
|
 -- uid2
 |
  - username
 |
  - email
 |
  - other_details

这种数据库结构不仅可以帮助您使每个孩子都独一无二,而且还可以帮助您搜索将来可能需要的具有特定usernameemail的用户。

这种数据库结构使您可以轻松地使用orderByChild()进行查询,并将usernameemail存储在uid下。

要查找用户名是否唯一,可以使用带有orderByChild()的简单查询,如下所示:

reference.orderByChild("username").equalTo(userNameYouWantToSearch).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            if(dataSnapshot.exists())
                             // do what you want
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) { // ToDo: do something for errors

                        }
                  )};

if()语句中,您只能说userNameYouWantToSearch已经存在于数据库中,因此不是唯一的。