如何在 Firebase (Android) 中实现 ondelete 级联

She*_*ran 1 android firebase firebase-realtime-database

我是 Firebase 的新手。我想在 Firebase 中实现 ondelete 级联。这是我想要解决的问题我有两个表“用户”和“组”。

{  "users":{
"user1":{
    "username":"john",
    "full_name":"John Vincent",
    "created_at":"9th Feb 2015",
    "groups":{
        "group1":true,
        "group3":true
    }
    "last_logins":...
},
"user2": ...,
"user3": ...
}"groups": {
 "group1"{
    "group_name":"Administrators",
    "group_description":"Users who can do anything!",
    "no_of_users":2,
    "members":{
        "user1":true,
        "user3":true
    }
  },
 "group2"{
    "group_name":"Moderators",
    "group_description":"Users who can only moderate!",
    "no_of_users":1,
    "members":{
        "user2":true
    }
  }
}
}
Run Code Online (Sandbox Code Playgroud)

请原谅我上面的代码缩进。

现在,如果我从用户表中删除了 user1,那么应该如何使用 Firebase 从组表中自动删除它。

这可以使用 SQL 轻松完成,但我不知道如何在 Firebase 中执行此操作。在 Firebase 中执行此操作的一种方法是从用户中删除 user1,然后将 group1 和 group3 设置为 null,然后在组表中将 user1 设置为 group1/member 下的 null,但这需要 2-3 次调用。那么有没有其他最好的方法来做到这一点。请帮助我,我被困在这里。

Fra*_*len 5

Firebase 数据库不知道其 JSON 树中值之间的关系。在 SQL/关系方面:它没有外键的概念。这意味着它也没有使用级联删除删除相关对象的选项。您需要分别删除每个值。

但是您可以通过使用多位置更新将所有这些删除合并到一个调用中。如果您写入null用户的每个位置,则可以通过调用以下方法删除所有位置updateChildren()

DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
Map<String,Object updates = new HashMap<String,Object>();
updates.put("users/user1", null);
updates.put("groups/group1/members/user", null);
// Do a deep-path update
ref.updateChildren(updatedUserData, new Firebase.CompletionListener() {
   @Override
   public void onComplete(FirebaseError firebaseError, Firebase firebase) {
       if (firebaseError != null) {
           System.out.println("Error updating data: " + firebaseError.getMessage());
       }
   }
})
Run Code Online (Sandbox Code Playgroud)

有了这个,你就可以编写安全规则验证一个组的成员也必须存在于/users节点下:

{
  "rules": {
    "groups":
      "$groupid": {
        "users": {
          "$uid": {
            ".validate": "newData.parent().parent().parent().parent().child('users').hasChild($uid)"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您将多个.parent()调用视为newRoot(不幸的是不存在),则验证规则会更容易理解。所以在伪代码中它是:

newRoot.child('users').hasChild($uid)
Run Code Online (Sandbox Code Playgroud)

换句话说:一个 UID 只能是一个组的成员,如果它也存在于/users.