在firebase数据库

时间:2017-12-22 11:24:58

标签: swift uitableview firebase firebase-realtime-database

Firebase结构

enter image description here

嗨,我试着找出如何查询jobBrand&我的Firebase数据库中的jobName(结构附加)并将其存储在tableView中。我将在每个工作品牌下存储更多信息,以便我尽可能保持这种结构?

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

tbaShootApp - >工作 - >招聘品牌>数据

我无法找到另一个级别并将其存储在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
}

}

以下是查询数据的代码 - 我有功能' fetchJobs'在我的superViewDidLoad中。

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

{
  "Jobs" : {
    "Candycrush" : {
      "cameraInfo" : {
        "cameraBody" : "A",
        "cameraBrand" : "Arri",
        "cameraType" : "Alexa"
      },
      "jobInfo" : {
        "jobBrand" : "CandyCrush",
        "jobName" : "Winter"
      }
    },
    "Honda" : {
      "cameraInfo" : {
        "cameraBody" : "A",
        "cameraBrand" : "Arri",
        "cameraType" : "Alexa XT"
      },
      "jobBrand" : "Honda",
      "jobName" : "Comet"
    },
    "WWF" : {
      "cameraInfo" : {
        "cameraBody" : "A",
        "cameraBrand" : "Red",
        "cameraType" : "Epic"
      },
      "jobInfo" : {
        "jobBrand" : "WWF",
        "jobName" : "Eye"
      }
    }
  }
}

2 个答案:

答案 0 :(得分:1)

还有很长的路要走,但也许这会有所帮助:

var arraydata = data.split(', ');

每次添加新作业时都会通知您(Candycrush,Honda等)。

(注意 - 除了其他任何内容之外,您也很可能也希望观察该列表中的删除。)

如果您正在制作表格(或其他......某种列表,分页内容,标签集合等):

的每一行几乎肯定会自己想要观察那份工作。

所以第一行会观察 .child("Jobs").observe(.childAdded)

中的变化

所以第二行会观察Jobs/Candycrush

中的变化

等等。每个表格行(或屏幕,面板,气泡,标签或其他任何内容)都会自己,观察那件事。

顺便说一句,几乎可以肯定的是,第一级"那里的头(你有本田,Candycrush等)将是一个id字符串。 (只需使用UUID,或让Firebase执行此操作。)然后选择一个字段" Title"将是本田等。使用实际的标题作为那里的ID是非常不寻常的。 (请注意,除了其他任何内容之外,您无法更改/编辑标题!)。

答案 1 :(得分:0)

更新

自从我发布回答以来,您已添加了更多信息。现在很明显,您想要更深入地查询。此外,由于您发布了实际的JSON,现在很明显JobBrand节点是动态的。您可以查询未知孩子下面的一个级别。您可以阅读here

我要将.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)
    }
})

原始回答

您当前的查询将返回作业下的所有数据。其中包括节点Job Brand - > jobinfo - >等。

如果您想获得更少的数据,那么您需要知道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)
            }
        }
    }
})

The documentation提供此示例用于循环快照

_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}