【问题标题】:Avoiding duplicate usernames in Firebase Database + Java避免在 Firebase Database + Java 中出现重复的用户名
【发布时间】:2017-05-25 17:00:04
【问题描述】:

我正在开发一个小应用程序来练习我的 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 是唯一的,我在上面的代码段中对其进行了硬编码......但它是 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"
        }
      }
  }
}

如果您有任何问题/澄清,请告诉我。我会定期离开电脑,但我会及时回来查看(我希望!)

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

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

    请查看来自 video 的 Frank van Puffelen 的解释。即使您需要对数据库进行一些改造,请记住,当我们谈论重复时,这是最佳做法。

    【讨论】:

    • 好的。我看了剪辑。所以基本上,我应该将我的“charName”值提升一个级别!所以... App / characters / charName / charID + 任何其他信息。所有存储在“charName”下所以我的后续问题是关于规则的。如何确保我不会重写现有条目?因为我认为这是我在深入测试之前遇到的第一个问题。因此,如果我有 charName = "George" 然后再次使用相同的名称单击 Create Account,它不只是覆盖现有的“George”吗?
    • 使用默认规则对其进行了测试。它似乎正在工作。它没有让我创建第二个“乔治”。稍后我回家后会更深入地测试它!谢谢亚历克斯!
    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多