我很想知道是否有方法来简化我的Firebase DB查询。Swift:简化嵌套Firebase提取/查询
此外,在进行拉取请求时,还有哪些最佳做法需要遵循。
我注意到我的层次结构从添加子项得到的结果更复杂,导致代码中出现极其艰难和长时间的查询。
我很想知道是否有方法来简化我的Firebase DB查询。Swift:简化嵌套Firebase提取/查询
此外,在进行拉取请求时,还有哪些最佳做法需要遵循。
我注意到我的层次结构从添加子项得到的结果更复杂,导致代码中出现极其艰难和长时间的查询。
如果你发现自己需要复杂的查询,这很可能意味着你的数据不正确的结构。 在你的情况下,你的结构需要被标准化(扁平化)。
以下修改应该让你的查询更加简单:
{
"listings": {
"listing_key_1": {
"timestamp": "2017 10 19 07:49:38"
},
"listing_key_2": {
"timestamp": "2017 10 19 05:30:02"
},
...
},
"AircraftHouseRules": {
"listing_key_1": {
"Availability": "",
...
},
"listing_key_2": {
"Availability": "",
...
}
},
"BasicInfo": {
"listing_key_1": {
"ModelPlane": "",
...
},
"listing_key_2": {
"ModelPlane": "",
...
}
},
...
}
我不明白你所说的“拉请求”的意思。如果你的意思是观察或者只是读取数据,那就很简单。所有你需要在你的情况下是一个listing
id /密钥来获得其数据的直接访问(AircraftHouseRules
,BasicInfo
, DetailedInformation
等)。
如果你想反向(通过获得上市的关键,让我们说,它TypeOfPlane
),你可以做下面的查询
// NOTE: Untested code - just for illustrative purposes
let queryRef = Database().database.reference.child("BasicInfo").queryOrdered(byChild: "TypeOfPlane").queryEqual(to: "some type")
queryRef.observeSingleEvent(of: .value, with { snapshot in
if let listings = snapshot.value as? [String : Any] {
// all retrieved listings with TypeOfPlane == "some type"
}
})
提示
你应该总是avoid nesting structures避免下载不必要的数据并影响性能。在您发布的屏幕截图中,您最多有8层嵌套数据。通过上面的修改,您可以轻松将这些级别减半。
您还应该考虑使用键值对替换所有的阵列结构(如ImageRef
下的那些),如arrays can be evil。
谢谢你的建议。我会做出改变。 – Cari95