使用swift在firebase中搜索子级
这应该很容易,有很多类似的问题,但没有什么适合我 这是我的代码,应该打印快照,但不打印使用swift在firebase中搜索子级,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,这应该很容易,有很多类似的问题,但没有什么适合我 这是我的代码,应该打印快照,但不打印 override func viewDidLoad() { super.viewDidLoad() let Ref = Database.database().reference(withPath: "Exhibitors-List/join").queryOrdered(byChild: "joinID").queryEqual(toValue:"1-22") re
override func viewDidLoad() {
super.viewDidLoad()
let Ref = Database.database().reference(withPath: "Exhibitors-List/join").queryOrdered(byChild: "joinID").queryEqual(toValue:"1-22")
ref.observe(.value, with: {
snapshot in
var newItems: [Exhibitors] = []
for item in snapshot.children{
print(snapshot.value as Any)
let joinItem = Exhibitors(snapshot: item as! DataSnapshot)
newItems.append(joinItem)
}
self.items = newItems
self.tableView.reloadData()
})
}
在idComp或boothLocation中搜索一个孩子而不是在joinID中搜索时,我没有问题获取快照,那么这是我的代码还是我的Firebase结构关闭了?您的代码要求查询位置
参展商列表/加入
,但您的数据库中不存在该位置。就我所见,还有另一个节点0
,位于参展商列表
和最近的加入
子节点之间。查询时不能跳过元素-您需要在完全存在的路径上进行查询。在某个位置运行查询时,Firebase会检查该位置的每个子级,以查找您订购的属性。参展商列表/加入
中没有数据,因此查询不会给出任何结果
相反,您要做的是在参展商列表上运行查询,然后在加入/joinID/0
上排序/筛选:
let Ref = Database.database().reference(withPath: "Exhibitors-List/join").queryOrdered(byChild: "joinID/0").queryEqual(toValue:"1-22")
这将起作用,但前提是您在索引0
中拥有所需的joinId
实际上,您要做的是在这里进行反向查找。您当前的数据结构有助于查找给定参展商的加入ID。这不利于找到现有参展商的加盟ID。为了有效实现这一点,您需要创建一个额外的数据结构:
joinIds: {
joinId1: {
exhibitorId1: true,
exhibitorId2: true
},
joinId2: {
exhibitorId2: true
}
}
使用此附加结构,您可以从/joinIds/1-22
快速查找参展商ID
另请参见我的解释:
}您好,其他工作有问题,回答得很好,先生们。你告诉我,我的数据库结构已经关闭,我的孩子搜索也已经停止。根据你的建议,我解决了我的问题。我将为未来的观众和你们自己的专家们做演讲。首先,让我谈谈Frank关于创建附加数据结构的建议。我确实有一个现有的数据结构,但是谷歌在上面显示的加入列表结构上说“只读模式激活”,我觉得因为有超过40K个加入,我的JSON树效率很低。下一步,加入代表一个参展商类别和子类别。所以我提出了我们几天前讨论过的方案。现在我用你的答案让它工作了。新结构见。和新的swift代码,感谢您的帮助。。。。。。。。let textj=“join/”let text=textj+detailNamer!打印(“在exsubvie详细信息名称(文本)”中)让Ref=Database.Database().reference(withPath:“参展商列表”).queryOrdered(byChild:text)。queryQual(toValue:1)Ref.observe(.value,with:{snapshot indetailNamer是一个来自上一个表视图的变量,如“1-22”。
override func viewDidLoad() {
super.viewDidLoad()
let textj = "join/"
let text = textj + detailNamer!
let Ref = Database.database().reference(withPath: "Exhibitors- List").queryOrdered(byChild:text).queryEqual(toValue:1)
Ref.observe(.value, with: {
snapshot in
var newItems: [Exhibitors] = []
for item in snapshot.children{
print(snapshot.value as Any)
let joinItem = Exhibitors(snapshot: item as! DataSnapshot)
newItems.append(joinItem)
}
self.items = newItems
self.tableView.reloadData()
})