在Firebase Database + Java中避免重复的用户名

时间:2017-05-24 21:51:02

标签: android firebase firebase-realtime-database

我正在开发一个小应用来练习我的JAVA / Firebase技能,而且我遇到了障碍。我承认我对Firebase以及与数据库部分相关的规则不是很熟悉。但我已经尝试查看其他SO帖子并搜索文档。

问题: 用户创建一个帐户(通过Firebase身份验证 - 电子邮件/密码)。然后他们就可以创造一个"字符"并提供这个"字符"有一个名字。所以我需要" charName"独一无二。显然,经过身份验证的ID也已经是唯一的。因此,我需要该应用程序告诉用户该名称是否已被采用或是否已经采用,然后继续将其添加到数据库中。

以下是我的代码的简化信息:

btnCreate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String charName = "MyCharactersName";
                final int charID = 123;

                mFirebaseDatabase.child("characters").addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot snapshot) {
                        if (!(snapshot.child(charName).exists())) {

                                Character newCharacter = new Character(charID, charName);

                                mFirebaseDatabase.child("characters").child(getNewCharID()).setValue(newCharacter); // add to database

                                Snackbar.make(findViewById(R.id.view_root), "Success", BaseTransientBottomBar.LENGTH_INDEFINITE).show();
                            } else {
                                Snackbar.make(findViewById(R.id.view_root), "Error creating a character.", BaseTransientBottomBar.LENGTH_INDEFINITE).show();
                            }
                        } else {
                            Snackbar.make(findViewById(R.id.view_root), "That character name is already taken.", BaseTransientBottomBar.LENGTH_INDEFINITE).show();
                        }
                    }
@Override
    public void onCancelled(DatabaseError databaseError) {
                            Snackbar.make(findViewById(R.id.view_root), "Error - Did not connect with Database", BaseTransientBottomBar.LENGTH_INDEFINITE).show();
                    }
                });
            }
        });

目前:该应用在数据库上创建了一个新字符,但您可以添加重复字符。 (顺便提一句,charID是唯一的,我在上面的snippit中硬编码了......但是它是timeStamp + 4个随机数字。)

因此,默认数据库规则显然会发生这种情况。在我读过的示例中,看起来我可能需要修改它们?

我的数据库结构是这样的:

App / characters / charID / charName

我尝试修改此SO帖子中的一些代码:How do you prevent duplicate user properties in Firebase?

这就是我写的,但它不起作用,正如我之前承认的那样,我不熟悉规则,所以我不确定我做错了什么。哈哈。

{
  "rules" : {
    "characters" : {
      "$charID" : {
        ".validate": "root.child('charName_lookup/'+newData.val()).val() === auth.uid"
      }
    },
    "charName_lookup" : {
       "$charName" : {
         ".write" : "!data.exists()",
         ".validate": "newData.val() === auth.uid"
        }
      }
  }
}

如果您有任何问题/解释,请告诉我。我会定期离开电脑,但我会立即检查(我希望!)

1 个答案:

答案 0 :(得分:0)

基本上,userNameemail address应该是您节点的名称。关于规则,您可以使用通配符。如果您创建userName George,要验证是否存在,您只需要在用户节点上添加引用并使用exists()方法。

请查看Frank van Puffelen对此video的解释。即使您需要重新编写数据库,请记住,当我们讨论重复数据时,这是最佳做法。