【发布时间】: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