Как удалить указанный документ c для текущего пользователя из Firebase Firestore в swift? - PullRequest
0 голосов
/ 29 апреля 2020

Я использую Firebase Firestore для хранения коллекции задач.
Я хочу создать следующий сценарий: когда пользователь удаляет заданную задачу c, она должна быть удалена из таблицы и базы данных только для этого текущего пользователя. Но я могу только удалить выбранную задачу из БД, но не для текущего пользователя. Пожалуйста, помогите!

Мой код настройки:

class TasksListScreen: UIViewController {
    var tasksArray = [Task]() // array of tasks via Task struct

    // to load data from db
    func loadData() {
        db.collection("tasks").getDocuments { (queryShapshot, error) in
            if let error = error {
                print("\(error.localizedDescription)")
            } else {
                self.tasksArray = queryShapshot!.documents.flatMap({Task(dictionary: $0.data())})
                // to update user interface
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            }
        }
    }
}

Я могу удалить выбранное задание (документ) из моей коллекции с помощью этого кода.

extension TasksListScreen: UITableViewDataSource, UITableViewDelegate {

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

        // if action is deletion
        if editingStyle == UITableViewCell.EditingStyle.delete {

            let title = tasksArray[indexPath.row].title
            let collectionRef = db.collection("tasks")
            let query : Query = collectionRef.whereField("title", isEqualTo: title)

            query.getDocuments(completion:{ (snapshot, error) in
                if let error = error {
                    print(error.localizedDescription)
                } else {
                    for document in snapshot!.documents {
                        self.db.collection("tasks").document("\(document.documentID)").delete()
                    }
                }
            })

            // delete task from table view
            tasksArray.remove(at: indexPath.row)
            //tableView.reloadData()
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
}

Но мне нужно удалить выбранный документ из БД только для текущего пользователя. Я пробовал этот код.

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

        // if action is deletion
        if editingStyle == UITableViewCell.EditingStyle.delete {

            // delete task from db for the current user
            let title = tasksArray[indexPath.row].title
            let user = Auth.auth().currentUser
            // access collection of tasks of the current user
            let collectionRef = db.collection("users").document((user?.uid)!).collection("tasks")
            // search for task with needed title
            let query : Query = collectionRef.whereField("title", isEqualTo: title)
            print(title)
            print(query)
            query.getDocuments(completion:{ (snapshot, error) in
                if let error = error {
                    print(error.localizedDescription)
                } else {
                    for document in snapshot!.documents {
                        self.db.collection("users").document((user?.uid)!).collection("tasks").document("\(document.documentID)").delete()
                    }
                }
            })
        }
 }

Удаляет задачу во время текущего сеанса, но при повторном запуске приложения появляется удаленная задача.

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 29 апреля 2020

Если в документе есть поле, содержащее идентификатор пользователя, вы можете сделать что-то вроде этого:

for document in snapshot!.documents {
     if document.userId == user.userId {
         self.db.collection("tasks").document("\(document.documentID)").delete()
}
               }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...