我是Firebase的新手。 我想用我的Firebase数据库中的数据制作一个应用程序,以显示在表格视图中。
示例:
假设我建立了一个数据库,如下所示:
{
"fruits": {
"Apple": {
"color": "Red",
"taste": "Bla bla...",
},
"Banana": {
"color": "Yellow",
"taste": "Bla bla...",
},
"Pear": {
"color": "Green",
"taste": "Bla bla...",
},
}
}
Firebase自动按字母顺序对数据库中的项目进行排序。现在,我想用字母顺序列出的所有水果制作一个tableview。当我点击一个水果时,它将推到一个新窗口,其中包含有关该特定水果的信息,例如“颜色”,“口味”等。 要记住的重要一点是,每当我向数据库中添加项目时(例如更多类型的水果),它都必须保持按字母顺序显示。我已经阅读了文档,但是没有运气。
我该怎么做?我知道如何制作表视图和创建数据库。但是,如何将数据库连接到表格视图,并使其从a-z打印出我的数据?也许按索引号?
谢谢。 :-)
答案 0 :(得分:0)
您可能要考虑其他结构
fruits
fruit_id_0 <- key created with childByAutoId
name: "Apple"
color: "Red"
taste: "blah blah"
从那里您有很多选择。
一个选项是使用.childAdded,它将一次遍历所有节点,并留下一个观察者,每当添加一个新孩子时,该观察者就会通知应用程序。 dataSource数组按名称在代码中排序。
let fruitsRef = self.ref.child("fruits")
fruitsRef.observe(.childAdded, with: { snapshot in
let fruitDict = snapshot.value as! [String: Any]
let fruitName = fruitDict["name"] as! String
self.fruitArray.append(fruitName)
self.fruitArray.sort() //sorts in place
self.myTableView.reloadData()
})
从那里开始,只要添加新的水果,就会调用闭包。新添加的水果已添加,数组排序并更新了UI。
如果您只有几个条目,上面的内容就可以了,但是如果您像我一样有很多水果,则它将在加载每个水果后对tableView进行排序和更新,这可能会导致闪烁或其他不期望的结果结果。
一个更好的选择是利用.value观察者出现在.child添加观察者之后的事实。考虑到这一点,您可以加载整个初始数据集,完成后,对其进行排序并更新tableView。同时让新水果的观察者将其添加到数据源中,对UI进行排序和更新。
以下是一些通过单击按钮即可启动的代码
func button0() {
self.configureChildAdded()
self.setInitialLoadCompleted()
}
两个类vars来跟踪加载过程中的位置,以及一个数组来存储水果名称
var initialLoad = true
var fruitArray = [String]()
然后是两个类,它们最初将对您的水果进行加载和排序,并留下一个.childAdded观察器,该观察器将监视其他水果并将其添加到数据源中,进行排序并更新tableView
func configChildAdded() {
let fruitsRef = self.ref.child("fruits")
fruitsRef.observe(.childAdded, with: { snapshot in //iterate over all fruits
let fruitDict = snapshot.value as! [String: Any]
let fruitName = fruitDict["name"] as! String
self.fruitArray.append(fruitName)
//upon first load, don't reload the tableView until all children are loaded
if ( self.initialLoad == false ) {
self.fruitArray.sort()
self.myTableView.reloadData()
}
})
}
//this .value event fires AFTER the child added events to load the tableView the first time
// all this does is update the UI and set the initalLoad to true and only fires once
func setInitialLoadCompleted() {
let fruitsRef = self.ref.child("fruits")
fruitsRef.observeSingleEvent(of: .value, with: { snapshot in
self.myTableView.reloadData()
self.initialLoad = false
})
}
请注意,使用此方法将完全避免使用代码中已完成的任何Firebase排序。这样可以更轻松地进行多字段排序等。