我想用这样的结构示例制作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 ...)
答案 0 :(得分:0)
嘿,安德鲁我会给你答案,然后让你重新考虑你设计Firestore架构的方式,因为它根本不是最优的,而且很容易变得非常复杂而且Firestore在这里警告:
https://firebase.google.com/docs/firestore/manage-data/structure-data
既然firstFilm
和firstBook
以及所有其他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
类别,您可以静态添加firstArticle
,secondArticle
,thirdArticle
。
此外,上面提到的documentId
可以从snapshot?.documents.documentID
检索到。您需要继续引用它才能完成获取初始集合中其余嵌套对象的路径。
所以答案是显示firstFilm
,secondFilm
,thirdFilm
您需要手动处理此问题,因为Firestore无法返回文档中存在的集合,您有手动引用这些集合并提供Firestore路径以获取该路径上的文档。
现在您可能已经意识到您设计的方式不是非常优化且不可扩展。我真的建议你找到一种更通用的设计方法,这样你就可以充分利用Firestore。请仔细阅读Firestore文档并加入更多考虑。
我的初步建议可能不是让firstFilm
,secondFilm
个集合在Film
中创建一个需要Array
个影片的字段。然后,您可以将影片传递给第二个视图控制器,并在第二个视图控制器中创建表格视图。但是,如果你更努力的话,这可能不是最佳的,你可以使它更通用。