Swift Firestore检索数据

时间:2018-05-27 10:50:48

标签: swift uitableview google-cloud-firestore

我想用这样的结构示例制作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中创建了一个结构

我有分类 - >文件(书籍,电影,连续剧)中有" name"并包含集合(firstFilm,secondFilm ...) - >文件中有"引用"

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

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

我把类别名称放到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
    }

它的工作很好,但是如何捕获并将数据放到另一个视图中,形成didSelectItemAt indexPath func并显示From Films - >点按 - >显示所有集合(firstFilm + secondFilm ...)

1 个答案:

答案 0 :(得分:0)

嘿,安德鲁我会给你答案,然后让你重新考虑你设计Firestore架构的方式,因为它根本不是最优的,而且很容易变得非常复杂而且Firestore在这里警告:

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

既然firstFilmfirstBook以及所有其他first_都是集合,您需要在Firestore上调用另一个fetch,以获取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类别,您可以静态添加firstArticlesecondArticlethirdArticle

此外,上面提到的documentId可以从snapshot?.documents.documentID检索到。您需要继续引用它才能完成获取初始集合中其余嵌套对象的路径。

所以答案是显示firstFilmsecondFilmthirdFilm您需要手动处理此问题,因为Firestore无法返回文档中存在的集合,您有手动引用这些集合并提供Firestore路径以获取该路径上的文档。

现在您可能已经意识到您设计的方式不是非常优化且不可扩展。我真的建议你找到一种更通用的设计方法,这样你就可以充分利用Firestore。请仔细阅读Firestore文档并加入更多考虑。

我的初步建议可能不是让firstFilmsecondFilm个集合在Film中创建一个需要Array个影片的字段。然后,您可以将影片传递给第二个视图控制器,并在第二个视图控制器中创建表格视图。但是,如果你更努力的话,这可能不是最佳的,你可以使它更通用。