Swift 在firebase数据库中搜索子项
火基结构 您好,我正在尝试解决如何在Firebase数据库(附结构)中查询jobBrand和jobName并将其存储在tableView中。我将在每个工作品牌下存储更多信息,因此如果可能,我希望保持这种结构 到目前为止,我可以让tableView读取这两个字段,如果它们是一级的,那么结构将是: tbashootap->Jobs->Job Brand>数据 我无法向下查询另一个级别并将其存储在tableView中。这可能吗 我正在使用字典存储工作信息:Swift 在firebase数据库中搜索子项,swift,uitableview,firebase,firebase-realtime-database,Swift,Uitableview,Firebase,Firebase Realtime Database,火基结构 您好,我正在尝试解决如何在Firebase数据库(附结构)中查询jobBrand和jobName并将其存储在tableView中。我将在每个工作品牌下存储更多信息,因此如果可能,我希望保持这种结构 到目前为止,我可以让tableView读取这两个字段,如果它们是一级的,那么结构将是: tbashootap->Jobs->Job Brand>数据 我无法向下查询另一个级别并将其存储在tableView中。这可能吗 我正在使用字典存储工作信息: class Job: NSObject {
class Job: NSObject {
var id: String?
var jobBrand: String?
var jobName : String?
var director : String?
var jobInfo : jobInfo?
init(dictionary: [String: AnyObject]) {
self.id = dictionary["id"] as? String
self.jobBrand = dictionary["jobBrand"] as? String
self.jobName = dictionary["jobName"] as? String
self.director = dictionary["Director"] as? String
}
}
下面是查询数据的代码——我的superViewDidLoad中有函数“fetchJobs”
func fetchJobs() {
Database.database().reference().child("Jobs").observe(.childAdded) { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let job = Job(dictionary: dictionary)
job.id = snapshot.key
self.jobs.append(job)
//this will crash because of background thread, use dispatch_async to fix
DispatchQueue.main.async(execute: {
self.tableView.reloadData()
})
}
}
}
JSON
更新 自从我发布我的答案后,你已经添加了更多的信息。现在很明显,您希望进行更深入的查询。此外,由于您发布了实际的JSON,现在很明显JobBrand节点是动态的。您可以查询未知子级下面的一个级别。你可以读一下 我要将
.observe(.childAdded)
更改为.observeSingleEvent(of:.value)
,因为您的查询太深了,我怀疑您是否希望观察该节点,但我可能错了。更改此选项将只拉入一次数据。如果要更新该值,则必须再次查询
您需要这样的查询:
Database.database().reference().child("Jobs").queryOrdered(byChild: "jobInfo/jobBrand").queryEqual(toValue: "JobBrandYouWant").observeSingleEvent(of: .value, with: { snapshot in
if let dictionary = snapshot.value as? [String: AnyObject] {
let job = Job(dictionary: dictionary)
job.id = snapshot.key
self.jobs.append(job)
}
})
原始答案
当前查询将返回作业下的所有数据。其中包括作业品牌->作业信息->等节点
如果你想获得更少的数据,那么你需要了解JobBrand、jobinfo或两者。然而,我认为你想要所有的工作,而你的查询就是不起作用
您当前的查询失败,因为您的字典包含“作业”下的所有内容,而不仅仅是一个作业。您希望在数据快照和快照上循环
在调用init之前获取每个作业
Database.database().reference().child("Jobs").observe(.childAdded, with: { snapshot in
for child in snapshot.children { // over over the snapshot and cast each "job" to it's own dictionary
let child = child as? DataSnapshot
if let key = child?.key {
if let dictionary = child?.value as? [String: AnyObject] {
let job = Job(dictionary: dictionary)
job.id = key
self.jobs.append(job)
}
}
}
})
提供了在快照上循环的示例
_commentsRef.observe(.value) { snapshot in
for child in snapshot.children {
...
}
}
还有很长的路要走,但也许这会有所帮助:
.child("Jobs").observe(.childAdded)
它会让你知道每一次新的工作是增加(坎迪克拉什,本田等)
(注意-除其他外,您很可能还希望观察该列表上的删除。)
如果您正在制作一个表格(或其他……某种列表、分页、选项卡集合等):
几乎可以肯定的是,表格的每一行都会自己去观察那份工作
因此,第一行将观察Jobs/Candycrush
因此,第二行将观察Jobs/Honda
等等。每个表格行(或屏幕、面板、气泡、选项卡或其他任何内容)都会自己观察到这一点
顺便说一句,几乎可以肯定的是,这里的“第一级”标题(本田、Candycrush等)是一个id字符串。(只需使用UUID,或者让Firebase来做。)然后字段“标题”将是Honda等。使用实际标题作为ID类型是非常不寻常的。(请注意,除其他外,您不能更改/编辑标题!)。我想我需要更改字典设置,以便它查找正确的子项,但这完全是猜测吗?此外,如果这是正确的,我不知道它应该是什么?阅读较低级别:
Database.Database()。所以我不知道每次都叫什么。有没有办法绕过该级别,或者只查找存在的每个“jobInfo”文件夹?jobInfo
是否总是相同的名称?或者这也是动态的?(提示:提供一个实际的JSON片段将使这种混淆的可能性大大降低)嗨,弗兰克·范·帕夫伦,我在文章中附加了一个JSON来帮助理解我的数据库。jobInfo始终是相同的名称。jobName的动态级别。感谢您回复我。我想在这个级别的应用程序中,我只想找到jobBrand和jobName。然后,当你进入每个工作时,会有更多的信息、附件等。是否值得为此tableview单独设置一个字典?如果有帮助,顶级的每个工作品牌下面都会有一个jobInfo节点,那么如果我不知道工作品牌节点,有没有办法查询jobInfo节点?是的,你可以这样做。看看这个问题,太好了!谢谢@DoesData
.child("Jobs").observe(.childAdded)