使用Firestore删除帐户和文档时出现问题

时间:2018-10-31 12:37:39

标签: swift xcode google-cloud-firestore

我想在Firestore中删除用户帐户及其所有文档,但是对于异步查询,Firebase会在所有文档之前删除该帐户。

因此我收到一个auth错误,因为当firestorm删除持续文档时,该用户不再存在。

db.collection("users").document(self.user.uid).collection("sachets").getDocuments() { (QuerySnapshot, err) in
    if let err = err{
        print("Erreur de lecture : \(err)")
    } else {
        for document in QuerySnapshot!.documents {
            db.collection("users").document(self.user.uid).collection("sachets").document(document.documentID).delete(){ err in
                if let err = err {
                    print("    Probleme de suppression des docuemnts \(err)")
                } else {
                    print("    Documents supprimés")
                }
            }
        }
    }
}
self.user?.delete { error in
    if let error = error {
        print("    Probleme de suppression du compte Utilisateur \(error)")
    } else {
        print("    Utilisateur supprimé")
    }
}

有人可以告诉我该怎么办? 谢谢

2 个答案:

答案 0 :(得分:1)

好的,我建立了一个测试项目并解决了这个问题。您还需要确保从用户字段中删除所有数据。例如,如果您在name节点上有ageuser等。

首先,我创建了一个函数来提取当前用户uid

func currentUser() -> String {
    return Auth.auth().currentUser!.uid
}

然后,我创建了一个功能,用于删除已登录用户的所有数据。这将首先删除所有子集合数据,然后将删除userID的文档。

要处理异步方法,您可以使用DispatchGroup通知所有异步调用何时完成。

旁注:如果不能100%保证有文档,请确保从不强制解开值。否则,您的应用可能会崩溃。要解决此问题,请使用guardif let来解决此问题。

// Where "user" is the result from currentUser()
func removeData(from user: String) {
    db.collection("users").document(user).collection("sachets").getDocuments { (snapshot, error) in
        if let error = error {
            // Handle error
        } else if let documents = snapshot?.documents {
            // Using if let to see if there are documents

            // Time to delete all the subCollection for the user
            self.deleteSubCollectionData(for: user, documents, completion: {

                // Once that done, make sure to delete all the fields on the highest level.
                self.db.collection("users").document(user).delete(completion: { (error) in
                    if let error = error {
                        // Handle error
                    } else {
                        // Delete the account
                        self.deleteAccount()
                    }
                })
            })
        }
    }
}

// This function will remove the subCollectionData
fileprivate func deleteSubCollectionData(for user: String, _ documents: [QueryDocumentSnapshot], completion: @escaping () -> ()) {
    let group = DispatchGroup()
    documents.forEach({
        group.enter()
        self.db.collection("users").document(user).collection("sachets").document($0.documentID).delete(completion: { (error) in
            if let error = error {
                // Handle error
            }
            group.leave()
        })
    })

    // Once the dispatchGroup is done...
    group.notify(queue: .main) {
        completion()
    }
}

最后...

func deleteAccount() {
    Auth.auth().currentUser?.delete { (error) in
        if let error = error {
            print(error)
        } else {
            print("Deleted account")
        }
    }
}

如果您不删除所有级别的数据,那么Firestore中仍然会有数据。

答案 1 :(得分:0)

您的getDocuments()方法是异步的,因此仅应在删除文档后删除帐户。

只需将user?.delete方法放在getDocuments()回调中

db.collection("users").document(self.user.uid).collection("sachets").getDocuments() { (QuerySnapshot, err) in
    if let err = err{
        print("Erreur de lecture : \(err)")
    } else {
        for document in QuerySnapshot!.documents {
            db.collection("users").document(self.user.uid).collection("sachets").document(document.documentID).delete(){ err in
                if let err = err {
                    print("    Problème de suppression des documents \(err)")
                } else {
                    print("    Documents supprimés")
                }
            }
        }
    }

    self.user?.delete { error in
        if let error = error {
            print("    Problème de suppression du compte Utilisateur \(error)")
        } else {
            print("    Utilisateur supprimé")
        }
    }
}