Firebase 规则如何在其父级被删除时防止添加或更新值
Firebase Rules how to prevent add or update value if its parent is deleted
我在问我是否有这个 firebase 数据库
Misters
+ 7m1fyYchDscr8tUeI13uPXvdDvM2
+ gvTVc3gwRfTz3WL48vTGiiiTKZ22
- vWZ55LGiraaIErIiiVN4NVQc6Eh1
active_type:true
age: 27
如果父节点已删除,如何防止添加新节点或更新现有节点
(vWZ55LGiraaIerIiiVN4NVQc6Eh1)?
例如我有阻止更新的规则
{
"rules": {
".read": true,
".write": "auth != null",
"Misters": {
"$Misterid": {
"active_type:true": {
".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
}
}
}
}
但是如果找不到父节点我想阻止
基本上,如果我理解正确的话,您的写入操作将重新创建已删除的 "vWZ55LGiraaIErIiiVN4NVQc6Eh1"。
所以我会这样做:
{
"rules": {
".read": true,
".write": "auth != null",
"Misters": {
".write" : "root.child('Misters').hasChild(<Misterid>)"
"$Misterid": {
"active_type:true": {
".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
}
}
}
}
- 将所有添加的 $Misterid 存储在名为 MistersAdded 的新节点中。这可以通过使用云函数自动完成
- 添加以下规则
这包括一个 exists() 方法,该方法将检查 MistersAdded 地图以查看它是否已被创建。如果您希望能够让用户删除地图,请添加 '|| data.val() == null' 写规则后面。
{
"rules": {
".read": true,
".write": "auth != null",
"Misters": {
"$Misterid": {
"active_type:true": {
".write": !root.child('MistersAdded').child($Misterid).exists()
".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
}
}
}
}
你真的想在 "rules" 做吗?这意味着您不能在应用逻辑时有选择性。我建议以编程方式进行。
DatabaseReference mDatabase = FirebaseDatabase.getInstance();
rootRef = mDatabase.child("vWZ55LGiraaIErIiiVN4NVQc6Eh1");
addListenerForSingleValueEvent(new ValueEventListener() {
@Override
void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
// run some code here if node exists
} else {
// run some code here if node does not exist
}
}
});
希望对您有所帮助。这样做意味着您可以做的不仅仅是验证,您甚至可以通知您的用户并执行 UI 操作。
我在问我是否有这个 firebase 数据库
Misters
+ 7m1fyYchDscr8tUeI13uPXvdDvM2
+ gvTVc3gwRfTz3WL48vTGiiiTKZ22
- vWZ55LGiraaIErIiiVN4NVQc6Eh1
active_type:true
age: 27
如果父节点已删除,如何防止添加新节点或更新现有节点 (vWZ55LGiraaIerIiiVN4NVQc6Eh1)?
例如我有阻止更新的规则
{
"rules": {
".read": true,
".write": "auth != null",
"Misters": {
"$Misterid": {
"active_type:true": {
".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
}
}
}
}
但是如果找不到父节点我想阻止
基本上,如果我理解正确的话,您的写入操作将重新创建已删除的 "vWZ55LGiraaIErIiiVN4NVQc6Eh1"。
所以我会这样做:
{
"rules": {
".read": true,
".write": "auth != null",
"Misters": {
".write" : "root.child('Misters').hasChild(<Misterid>)"
"$Misterid": {
"active_type:true": {
".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
}
}
}
}
- 将所有添加的 $Misterid 存储在名为 MistersAdded 的新节点中。这可以通过使用云函数自动完成
- 添加以下规则
这包括一个 exists() 方法,该方法将检查 MistersAdded 地图以查看它是否已被创建。如果您希望能够让用户删除地图,请添加 '|| data.val() == null' 写规则后面。
{
"rules": {
".read": true,
".write": "auth != null",
"Misters": {
"$Misterid": {
"active_type:true": {
".write": !root.child('MistersAdded').child($Misterid).exists()
".validate": "(data.val() == null) || (data.isString() && (data.val().length == 0))"
}
}
}
}
你真的想在 "rules" 做吗?这意味着您不能在应用逻辑时有选择性。我建议以编程方式进行。
DatabaseReference mDatabase = FirebaseDatabase.getInstance();
rootRef = mDatabase.child("vWZ55LGiraaIErIiiVN4NVQc6Eh1");
addListenerForSingleValueEvent(new ValueEventListener() {
@Override
void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
// run some code here if node exists
} else {
// run some code here if node does not exist
}
}
});
希望对您有所帮助。这样做意味着您可以做的不仅仅是验证,您甚至可以通知您的用户并执行 UI 操作。