Firebase结构
嗨,我试着找出如何查询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"
}
}
}
}
答案 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(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)
}
})
原始回答
您当前的查询将返回作业下的所有数据。其中包括节点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 {
...
}
}