Swift Firestore восстановить данные - PullRequest
0 голосов
/ 27 мая 2018

Я хочу сделать QuoteApp с таким примером структуры:

{
    "Books": {
        "firstBook": {
            "Quotes": {
                "Quote1": "",
                "Quote2": "",
                "Quote3": ""
            },
            "name": "firsBook"
        },
        "secondBook": {
            "Quote": {
                "Quote1": "",
                "Quote2": "",
                "Quote3": ""            
    },
            "name": "secondBook"
        }
    },
     "Serials": {
        "firstSerial": {
            "Quote": {
                "Quote1": "",
                "Quote2": "",
                "Quote3": ""
            },
            "name": "firsSerial"
        },
        "secondSerial": {
            "Quote": {
                "Quote1": "",
                "Quote2": "",
                "Quote3": ""
            },
            "name": "secondSerial"
        }
    }

Я создал структуру в Firestore

У меня есть Категория -> документы (Книги, Фильмы, Серийные), в которых естьэто «имя» и содержит коллекции (firstFilm, secondFilm ...) -> документы, в которых есть «цитата»

https://i.stack.imgur.com/wp0pu.png

https://i.stack.imgur.com/KhFSq.png

Iпоместите имя категории в tableView следующим образом:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var myTableView: UITableView!

    var array: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        myTableView.delegate = self
        myTableView.dataSource = self

        let db = Firestore.firestore()
        db.collection("Category").getDocuments { (snapshot, error) in
            if error != nil {
                print(error)
            } else {
                for document in (snapshot?.documents)! {
                    if let name = document.data()["name"] as? String {
                    self.array.append(name)
                        DispatchQueue.main.async {
                            self.myTableView.reloadData()
                        }
                    }
                }
            }
        }
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return array.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let category = array[indexPath.row]
        cell.textLabel?.text = category
        return cell
    }

Работает хорошо, но как мне перехватить и поместить данные в другой View, создать форму didSelectItemAt indexPath и показать из фильмов -> нажмите -> показать все коллекции (firstFilm + secondFilm ...)

1 Ответ

0 голосов
/ 27 мая 2018

Привет, Эндрю, я собираюсь дать вам ответ на то, что вы спросили, а затем также заставлю вас пересмотреть способ, которым вы разработали схему Firestore, так как она совсем не оптимальна и будет очень сложной, и Firestore предупреждаетэтого здесь:

https://firebase.google.com/docs/firestore/manage-data/structure-data

Теперь, поскольку firstFilm и firstBook и все остальные first_ являются коллекциями, вам нужно будет вызвать другую выборку в Firestoreвот так, чтобы получить содержимое этого first_ (имейте в виду содержимое, а не сами коллекции), вот так:

db.collection("Category").document("Film").collection("firstFilm").getDocuments

Также, чтобы сделать вещи более общими, обычно это шаблон, который следует Firestore:

db.collection("Collection Name").document("documentId").collection("Collection Name").....

Как вы можете видеть, поскольку first_ second_ являются коллекциями, вы не можете выбрать их для отображения в следующем табличном представлении пользователю, чтобы выбрать first_ second_.Вам статически нужно было бы добавить их в ваше приложение, чтобы вы могли показать пользователю, что он может выбрать то, что называется first_.Это плохо, потому что, скажем, завтра вы добавляете категорию Article, которую вы бы статически добавили firstArticle, secondArticle, thirdArticle.

Кроме того, documentId, упомянутый выше, можно получить из snapshot?.documents.documentID.Вам нужно будет сохранить ссылку на него, чтобы иметь возможность завершить путь для извлечения остальных вложенных объектов в вашей исходной коллекции.

Таким образом, ответ должен показать firstFilm, secondFilm, thirdFilm вам нужно будет обработать это вручную, так как Firestore не будет возвращать, какие коллекции существуют в документе, вы должны вручную ссылаться на эти коллекции и указывать путь к Firestore, чтобы получить документы по этому пути.

Теперь какВы могли бы понять, что способ, которым вы проектировали, не очень оптимален и не масштабируем.Я действительно предлагаю вам найти способ более общего дизайна, чтобы вы могли использовать лучшее в Firestore.Просмотрите документацию Firestore и подумайте о ней.

Мое первоначальное предложение может заключаться в том, чтобы вместо firstFilm, secondFilm коллекций создать поле в Film, которое занимает Array фильмов,Тогда вы могли бы передать фильмы второму контроллеру представления и создать табличное представление в вашем втором контроллере представления.Тем не менее, это может быть неоптимально, но вы можете сделать его еще более общим, если будете стараться изо всех сил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...