2017-04-09 22 views
0

我是Firebase的新成員。我想在Firebase中實現ondelete級聯。 這裏是我想要解決的問題 我有兩個表「用戶」和「組」。如何在Firebase中實現ondelete級聯(Android)

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

請原諒我上面的代碼縮進。

現在,如果我從users表中刪除user1,那麼應該如何使用Firebase自動從組表中自動刪除它。

這可以使用SQL輕鬆完成,但我不知道如何在Firebase中執行此操作。在Firebase中執行此操作的一種方法是從用戶中刪除user1,然後將group1和group3設置爲null,然後在group group中將group1/member下的user1設置爲null,但這需要2-3次調用。那麼是否還有其他最好的方法來做到這一點。 請幫我我卡在這裏。

回答

2

Firebase數據庫不知道其JSON樹中值之間的關係。在SQL /關係術語中:它沒有外鍵的概念。這意味着它也沒有選擇使用級聯刪除來刪除相關對象。您需要分別刪除每個值。

但是,您可以使用multi-location updates將所有這些刪除操作合併到一個呼叫中。如果你寫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()); 
     } 
    } 
}) 

有了這個地方,然後你可以寫security rulesvalidate,一個組的成員必須還存在/users節點下:

{ 
    "rules": { 
    "groups": 
     "$groupid": { 
     "users": { 
      "$uid": { 
      ".validate": "newData.parent().parent().parent().parent().child('users').hasChild($uid)" 
      } 
     } 
     } 
    } 
    } 
} 

驗證規則是一個更容易一點,如果你讀了多個.parent()電話爲newRoot(不幸的是不存在的)理解。因此,在僞代碼是:

newRoot.child('users').hasChild($uid) 

在詞:一個UID只能是一個組的成員,如果它也/users下存在。

+1

我想要的完美解決方案。謝謝@Frank van Puffelen –

相關問題