Firestore - Создание копии коллекции - PullRequest
0 голосов
/ 11 июня 2018

Итак, у меня есть коллекция под названием «Черновики», которая содержит несколько документов с автоматическим идентификатором.Каждый документ содержит поля «имя» и «подробности».Каждый документ отображается в tableViewCell в «nameLabel» и «detailsLabel».То, что я хотел бы сделать, это когда пользователь нажимает на кнопку в верхней части экрана First viewController, создается копия коллекции «Черновики» и вставляется под новым именем коллекции под названием «Сообщения».Эта коллекция затем ссылается на Second ViewControllers tableViewCells, как и на First ViewController, только на этот раз на него ссылаются в коллекции «Messages».Проведя некоторые исследования, я смутно склоняюсь к тому, что в ответе используются облачные функции, которые по существу создают копию коллекции и вставляют ее с новым именем коллекции.Несмотря на то, что я относительно новичок в кодировании и создании баз данных, я не знаю, как это сделать, и не знаю, является ли это правильным решением.Пожалуйста, кто-то может помочь, любая помощь очень ценится!Спасибо!

Первый ViewController

func loadDrafts() {

    let userRef = db.collection("Users").document(user!)

    let draftsRef = userRef.collection("Drafts")

    exercisesRef.getDocuments { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            if let snapshot = querySnapshot {
                for document in snapshot.documents {
                    let data = document.data()
                    let name = data["name"] as? String ?? ""
                    let details = data["details"] as? String ?? ""
                    let newDrafts = DraftMessages(name: name, details: details)
                    self.array.append(newDrafts)
                }
                self.tableView.reloadData()
            }
        }
    }

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! DraftsCell

    cell.nameLabel.text = array[indexPath.row].name
    cell.detailsLabel.text = array[indexPath.row].details

    return cell
}

@IBAction func goButton(_ sender: UIButton) {

\\ Add code here to create copy of previous collection "Drafts" and paste in new collection "Messages"

}

Второй ViewController

func loadData() {

    let userRef = db.collection("Users").document(user!)

    userRef.collection("Messages").getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                let data = document.data()
                let name = data["name"] as? String ?? ""
                let details = data["details"] as? String ?? ""
                let newMessages = Messages(name: name, details: details)
                self.array.append(newMessages)
            }
            self.tableView.reloadData()
        }
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! MessagesCell

    cell.nameLabel.text = array[indexPath.row].name
    cell.detailsLabel.text = array[indexPath.row].details

    return cell

}

1 Ответ

0 голосов
/ 12 июня 2018

Вот мое рабочее решение.Большое спасибо Franks за помощь!

@IBAction func goButton(_ sender: UIButton) {

    let userRef = db.collection("Users").document(user!)

    let draftsRef = userRef.collection("Drafts")

    draftsRef.getDocuments { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            if let snapshot = querySnapshot {
                for document in snapshot.documents {
                    let data = document.data()
                    let batch = self.db.batch()
                    let docset = querySnapshot

                    let messagesRef = userRef.collection("Messages").document()

                    docset?.documents.forEach {_ in batch.setData(data, forDocument: messagesRef)}

                    batch.commit(completion: { (error) in
                        if let error = error {
                            print("\(error)")
                        } else {
                            print("success")
                        }
                    })
                }
            }
        }
    }
}

Редактировать для Vaibhav Jhaveri:

Эта функция (как мы надеемся) дублирует как данные извлеченных документов, так и данные внутри этой коллекции документов.(Я не проверял это все же)

func duplicate() {
    let userRef = db.collection("Users").document(userID)
    let batch = self.db.batch()

    let draftsRef = userRef.collection("Drafts")
    draftsRef.getDocuments { (snapshot, err) in
        if let err = err {
            print(err.localizedDescription)
            return
        }

        guard let snapshot = snapshot else { return }

        snapshot.documents.forEach({ (document) in
            let data = document.data()
            let messageID = UUID().uuidString

            let messagesRef = userRef.collection("Messages").document(messageID)
            batch.setData(data, forDocument: messagesRef, merge: true)

            let yourSubCollectionRef = draftsRef.document(document.documentID).collection("yourSubCollection")
            yourSubCollectionRef.getDocuments(completion: { (subSnapshot, subErr) in
                if let subErr = subErr {
                    print(subErr.localizedDescription)
                    return
                }

                guard let subSnapshot = subSnapshot else { return }

                subSnapshot.documents.forEach({ (subDocument) in
                    let subData = subDocument.data()
                    let subDocID = UUID().uuidString

                    let yourNewSubCollectionRef = userRef.collection("Messages").document(messageID).collection("yourSubCollection").document(subDocID)
                    batch.setData(subData, forDocument: yourNewSubCollectionRef, merge: true)
                })
            })
        })

        batch.commit()
    }
}
...