Swift:简化嵌套的Firebase提取/查询

时间:2017-10-20 17:56:48

标签: ios iphone swift firebase firebase-realtime-database

我很想知道是否有办法简化我的Firebase数据库查询。

此外,在提出拉取请求时应遵循哪些最佳做法。

我注意到我的层次结构越复杂,在我的代码中添加子项会产生非常费力和长时间的查询。

以下是我的应用程序中的查询示例: enter image description here

enter image description here

1 个答案:

答案 0 :(得分: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 /密钥即可直接访问其数据(AircraftHouseRulesBasicInfoDetailedInformation等等。)。

如果您想要反向(通过,例如,通过其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个级别的嵌套数据。通过上述修改,您可以轻松地将这些级别减半。

您还应该考虑将键值对替换为arrays can be evil的所有数组结构(例如ImageRef下的数组结构)。