如何从Firebase数据库中删除用户

所以我想添加一个用户删除他的帐户到我的应用程序的function..简单的权利? 我看文件,它很容易:

FirebaseAuth.getInstance().getCurrentUser().delete() 

但是,FirebaseDatabase和Storage中的所有数据仍然保留。 这是我的结构(给予或承担) 在这里输入图像说明

在firebase存储它更简单一点,所以我不包括在这个问题..

现在的问题是,用户几乎与所有的节点有关联,并且有很多地方需要删除。 从android设备用户发送“DeleteUserRequest”到服务器,服务器负责删除用户。 但做完方法后,它的地狱! 我需要借用爸爸的显示器来编码,因为太深的嵌套调用!

这里是方法

 public static void deleteUser(DeleteUserRequest request, ExecutorService executorService) { deleteUserReferences(request.getUserId(), executorService); deleteUserStorage(request.getUserId()); } /** * Delete Tree * - /grades/userId * - /subjects/userId * - /user_groups/userId -> save groupIdList * - /group_members/groupId/userId * - /groups/groupId/ [where createdBy=userId]  save friendIdList * - /user-friends/friendId/userId * - /user_tokens/userId * - /users/userId * - /friend_requests/userId * - /friend_requests/friendUserId/userId */ private static void deleteUserReferences(final String userId, ExecutorService executorService) { final MultiPathUpdate deleteUpdate = new MultiPathUpdate(FirebaseDatabase.getInstance().getReference()); FirebaseDatabase.getInstance().getReference() .child(DatabaseConstants.LOCATION_GROUPS) .orderByChild(DatabaseConstants.PROPERTY_CREATED_BY) .equalTo(userId) .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { final ArrayList groupIdsWhereAdmin = new ArrayList(); if (dataSnapshot.exists()) { for (DataSnapshot snapshot : dataSnapshot.getChildren()) { groupIdsWhereAdmin.add(snapshot.getKey()); } } for (String groupId : groupIdsWhereAdmin) { GroupRequestManager.deleteGroup(new DeleteGroupRequest(groupId, userId), executorService); } FirebaseDatabase.getInstance().getReference() .child(DatabaseConstants.LOCATION_USER_GROUPS) .child(userId) .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { for (DataSnapshot snapshot : dataSnapshot.getChildren()) { final String groupId = snapshot.getKey(); deleteUpdate.delete(new ChildLocation() .child(DatabaseConstants.LOCATION_GROUP_MEMBERS) .child(groupId) .child(userId)); } } FirebaseDatabase.getInstance().getReference() .child(DatabaseConstants.LOCATION_USER_FRIENDS) .child(userId) .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { for (DataSnapshot snapshot : dataSnapshot.getChildren()) { final String friendId = snapshot.getKey(); deleteUpdate.delete(new ChildLocation() .child(DatabaseConstants.LOCATION_USER_FRIENDS) .child(friendId) .child(userId)); } } FirebaseDatabase.getInstance().getReference() .child(DatabaseConstants.LOCATION_FRIEND_REQUEST) .orderByChild(userId) .equalTo(true) .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { for (DataSnapshot snapshot : dataSnapshot.getChildren()) { final String friendRequestId = snapshot.getKey(); deleteUpdate.delete(new ChildLocation() .child(DatabaseConstants.LOCATION_FRIEND_REQUEST) .child(friendRequestId) .child(userId)); } } deleteUpdate.delete(new ChildLocation() .child(DatabaseConstants.LOCATION_USER_GROUPS) .child(userId)); deleteUpdate.delete(new ChildLocation() .child(DatabaseConstants.LOCATION_GRADES) .child(userId)); deleteUpdate.delete(new ChildLocation() .child(DatabaseConstants.LOCATION_SUBJECTS) .child(userId)); deleteUpdate.delete(new ChildLocation() .child(DatabaseConstants.LOCATION_USER_FRIENDS) .child(userId)); deleteUpdate.delete(new ChildLocation() .child(DatabaseConstants.LOCATION_USER_TOKENS) .child(userId)); deleteUpdate.delete(new ChildLocation() .child(DatabaseConstants.LOCATION_USERS) .child(userId)); deleteUpdate.delete(new ChildLocation() .child(DatabaseConstants.LOCATION_FRIEND_REQUEST) .child(userId)); deleteUpdate.update(new DatabaseReference.CompletionListener() { @Override public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { if (databaseError != null) { databaseError.toException().printStackTrace(); } } }); } @Override public void onCancelled(DatabaseError databaseError) { databaseError.toException().printStackTrace(); } }); } @Override public void onCancelled(DatabaseError databaseError) { databaseError.toException().printStackTrace(); } }); } @Override public void onCancelled(DatabaseError databaseError) { databaseError.toException().printStackTrace(); } }); } @Override public void onCancelled(DatabaseError databaseError) { databaseError.toException().printStackTrace(); } }); } 

正如你所看到的,它的地狱调试和维护…我没有包括GroupRequestManager.deleteGroup(..)但相信,它的地狱一样这个方法..问题是现在我该怎么办? 是否有某种扁平的嵌套调用框架? 它的棘手,因为所有这些调用都需要被做出来才能得到正确的数据。有什么能帮助解决这个地狱? 另一种编程风格? RxJava? 我切换到kotlin? 我只是不给用户选择删除他的帐户,而只是“禁用”它或什么?

正如道格·史蒂文森(Doug Stevenson)所说,并不比在所有位置创建用户数据更糟糕。 其实更简单。 创建一个方法, set the value to null ,如下所示:

 private static void deleteUser() { Map map = new HashMap<>(); map.put("referenceOne", new HashMap<>().put("keyOne", null)); map.put("referenceTwo", new HashMap<>().put(keyTwo, null)); map.put("referenceThree", new HashMap<>().put(keyThree, null)); //and so on databaseReference.updateChildren(map); } 

这是最好的办法,因为你会一次删除所有的数据。 它也被称为primefaces事务,因为通过这种方式,你将确保所有这些代码行将被执行。

希望能帮助到你。