我很想知道是否有方法來簡化我的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