Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在firebase数据库中搜索子项_Swift_Uitableview_Firebase_Firebase Realtime Database - Fatal编程技术网

Swift 在firebase数据库中搜索子项

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 {

火基结构

您好,我正在尝试解决如何在Firebase数据库(附结构)中查询jobBrand和jobName并将其存储在tableView中。我将在每个工作品牌下存储更多信息,因此如果可能,我希望保持这种结构

到目前为止,我可以让tableView读取这两个字段,如果它们是一级的,那么结构将是:

tbashootap->Jobs->Job Brand>数据

我无法向下查询另一个级别并将其存储在tableView中。这可能吗

我正在使用字典存储工作信息:

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(b‌​yChild: "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)