通过分配的键查询数据库

时间:2019-06-03 20:04:48

标签: swift firebase firebase-realtime-database

我要使用Swift来查询存储在Firebase(实时数据库)中的一些虚拟数据,对此我有点陌生,所以我很重视您的帮助。

{
  "Site-List" : {
    "1" : {
      "address" : "test1",
      "latitude" : 0,
      "live" : false,
      "longitude" : 0,
      "siteName" : "Test1"
    },
    "2" : {
      "address" : "test2",
      "latitude" : 0,
      "live" : false,
      "longitude" : 0,
      "siteName" : "Test2"
    }
  }
}
var sites: [SiteList] = []

findSite("1")
print(sites)

func findSite(id: String)  {
    let ref = Database.database().reference().child("Site-List")

    ref.observe(.value, with:{ (snapshot: DataSnapshot) in
        var newItems: [SiteList] = []
        for child in snapshot.children {
            if let snapshot = child as? DataSnapshot,
                let siteList = SiteList(snapshot: snapshot) {
                for site in siteList.key {
                    if String(site) == "1" {
                        newItems.append(siteList)
                    }
                }
            }
        }
        self.sites = newItems
    })
}

如何通过查询Firebase来获取"1"中存储的所有内容?

真的很感激此事。

亲切的问候, 乔治

1 个答案:

答案 0 :(得分:0)

我将提出这个答案,专门回答这个问题

  

如何通过查询来获取存储在“ 1”中的所有内容   Firebase?

答案是;如果您知道所需数据的路径,则无需查询。

func readSite() {
    let site1Ref = self.ref.child("Site_List").child("1")
    site1Ref.observeSingleEvent(of: .value, with: { snapshot in
        let address = snapshot.childSnapshot(forPath: "address").value as? String ?? "No address"
        let name = snapshot.childSnapshot(forPath: "siteName").value as? String ?? "No site name"
        print(address, name)
    })
}

输出将是

test1  Test1

话虽如此,如果您实际上想查询的话,则需要知道要查询的内容。例如,假设您要查询所有值为 test1

的地址。
func querySite() {
    let sitesRef = self.ref.child("Site_List")
    let queryRef = sitesRef.queryOrdered(byChild: "address").queryEqual(toValue: "test1")
    queryRef.observeSingleEvent(of: .value, with: { snapshot in
        for snap in snapshot.children.allObjects as! [DataSnapshot] {
            let address = snap.childSnapshot(forPath: "address").value as? String ?? "No address"
            let name = snap.childSnapshot(forPath: "siteName").value as? String ?? "No site name"
            print(address, name)
        }
    })
}

输出将是

test1  Test1

如果有多个结果,则将全部打印出来。

对于此查询,我使用的.value可能在快照中返回多个子快照结果,因此需要迭代快照以处理返回的每个子快照。

请注意,在我的答案中,代码self.ref.指向 my Firebase的根,您将其设置为指向您使用的任何父节点。