Запрос к базе данных по назначенному ключу - PullRequest
0 голосов
/ 03 июня 2019

У меня есть немного фиктивных данных, которые я пытаюсь запросить, хранящихся в Firebase (База данных в реальном времени) с использованием Swift, и я немного новичок в этом, поэтому я был бы признателен за вашу помощь.

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

Как бы я мог получить все, что хранится в "1", запросив Firebase?

Действительно признателен за любую помощь или освещение по этому вопросу.

С уважением, Джордж

1 Ответ

0 голосов
/ 04 июня 2019

Я собираюсь представить этот ответ, который конкретно отвечает на вопрос

Как бы я мог получить все, что хранится в «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, вы должны указать, чтобы он указывал на любой родительский узел, который вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...