我是firebase的新手。我想用我的Firebase数据库中的数据制作一个应用程序,以便在表视图中显示。
示例:
假设我创建了一个数据库,如下所示:
{
"fruits": {
"Apple": {
"color": "Red",
"taste": "Bla bla...",
},
"Banana": {
"color": "Yellow",
"taste": "Bla bla...",
},
"Pear": {
"color": "Green",
"taste": "Bla bla...",
},
}
}Firebase会自动按字母顺序对数据库中的项目进行排序。现在我想做一个按字母顺序列出所有水果的表视图。当我点击一个水果时,它会推送到一个新的窗口,上面有关于那个特定水果的信息,比如“颜色”、“味道”等等。重要的是要记住的是,每当我向我的数据库添加项目(比如更多种类的水果)时,它必须按字母顺序显示。我已经阅读了文档,但没有任何运气。
我该怎么做呢?我知道如何制作表视图和创建数据库。但是,如何将我的数据库连接到我的表视图,并让它从a-z打印出我的数据呢?也许是通过索引号?
谢谢。:-)
发布于 2018-08-09 02:16:04
您可能需要考虑不同的结构
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进行排序和更新,一遍又一遍,这可能会导致闪烁或其他不希望看到的结果。
更好的选择是利用在.child添加观察者之后发生的.value观察者这一事实。考虑到这一点,您可以加载整个初始数据集,完成后,对其进行排序并更新tableView。同时,为新水果留下一个观察者,它会将其添加到dataSource中,排序并更新您的UI。
下面是一些可以通过单击按钮来启动的代码
func button0() {
self.configureChildAdded()
self.setInitialLoadCompleted()
}两个类变量用于跟踪我们在加载过程中所处的位置,数组用于存储水果名称
var initialLoad = true
var fruitArray = [String]()然后是两个类,它们最初将加载和排序您的水果,并留下一个.childAdded观察器,它将监视其他水果并将它们添加到dataSource、排序和更新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排序,因为它是在代码中完成的。这将使多字段排序等工作变得更容易。
https://stackoverflow.com/questions/51736989
复制相似问题