我正在开发一个小应用来练习我的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"
}
}
}
}
如果您有任何问题/解释,请告诉我。我会定期离开电脑,但我会立即检查(我希望!)
答案 0 :(得分:0)
基本上,userName
或email address
应该是您节点的名称。关于规则,您可以使用通配符。如果您创建userName George,要验证是否存在,您只需要在用户节点上添加引用并使用exists()
方法。
请查看Frank van Puffelen对此video的解释。即使您需要重新编写数据库,请记住,当我们讨论重复数据时,这是最佳做法。