首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据分配的键查询数据库

根据分配的键查询数据库
EN

Stack Overflow用户
提问于 2019-06-04 04:04:48
回答 1查看 37关注 0票数 0

我有一些虚拟数据,我正在尝试使用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"中的所有内容?

真的很感谢在这件事上的任何帮助或帮助。

致以良好的问候,乔治

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-05 03:11:07

我将给出这个具体回答这个问题的答案。

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

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

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.指向我的Firebase的根,您可以将其设置为指向您使用的任何父节点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56433863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档