2017-05-24 35 views
1

我正在开发一个小型应用程序来练习我的JAVA/Firebase技能,并且我遇到了障碍。我确实承认我对Firebase以及与数据库部分相关的规则不是很熟悉。但我曾试着查看其他SO帖子并搜索文档。避免在Firebase数据库+ Java中使用重复的用户名

问题: 用户创建一个帐户(通过Firebase身份验证 - 电子邮件/密码)。然后他们能够创建一个“角色”并为这个“角色”提供一个名字。所以我需要“charName”是唯一的。显然,身份验证的ID也是唯一的。所以我需要这个应用程序来告诉用户名称是否已经被使用或者是否已经被使用,然后继续将其添加到数据库中。

这里是我的代码简化snippits:

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" 
     } 
     } 
    } 
} 

如果您有任何疑问/澄清请让我知道。我会定期离开电脑,但我会立即检查(我希望!)

回答

0

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

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

+0

好的。我看了剪辑。所以基本上,我应该把我的价值“charName”,并将其提升一个级别!所以... App /字符/ charName/charID +任何其他信息。所有存储在“charName” 所以我的后续问题是关于规则。我如何确保我不会重写现有条目?因为我认为这是我在深入研究之前测试的第一个问题。所以,如果我有charName =“George”,然后再次用相同的名称再次点击创建帐户,是不是只覆盖现有的“乔治”? –

+0

使用默认规则对其进行测试。它似乎在工作。它并没有让我创造出第二个“乔治”。稍后当我回家时,我会对它进行更深入的测试!谢谢Alex! –

+0

请看我更新的答案。 –

相关问题