2017-10-20 149 views
0

我很想知道是否有方法来简化我的Firebase DB查询。Swift:简化嵌套Firebase提取/查询

此外,在进行拉取请求时,还有哪些最佳做法需要遵循。

我注意到我的层次结构从添加子项得到的结果更复杂,导致代码中出现极其艰难和长时间的查询。

这里是我的应用程序中的查询的例子: enter image description here

enter image description here

回答

0

如果你发现自己需要复杂的查询,这很可能意味着你的数据不正确的结构。 在你的情况下,你的结构需要被标准化(扁平化)。

以下修改应该让你的查询更加简单:

{ 
    "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

+0

谢谢你的建议。我会做出改变。 – Cari95