Я хочу знать, как разметить базу данных Firebase, чтобы я мог легко получить данные о координатах. (Только вчера начал использовать Firebase, поэтому я очень новичок в этом)
ViewController
var reference: DatabaseReference!
var handle: DatabaseHandle?
viewDidLoad
reference = Database.database().reference()
handle = ref.child("Places/America/Capital/Washington/Coordinates").observe(.value, with: { (snapshot) in
for child in snapshot.children {
let theSnap = child as! DataSnapshot
let theValue = theSnap.value as! Double
print(theValue)
}
Это идеально печатает координаты. Но есть ли способ получить все координаты в моей базе данных? Я неправильно размещаю базу данных или какой синтаксис мне следует использовать, чтобы получить все данные, в которых есть широта и долгота?
Изображение базы данных Firebase
редактировать 1 Нет ли простого способа выполнить цикл for-in вместо простого копирования строки дескриптора и изменения необходимого пути к файлу?





Вы так близки.
Указанный вами путь (ссылка Firebase) предназначен для определенного набора координат в узле координат. Затем вы перебираете два дочерних узла в системе координат, которая выводит дочерние узлы широты и долготы.
Если вы хотите получить координаты для всех, вам нужно подняться на несколько уровней и использовать ту же технику для перебора дочерних узлов.
Поначалу сложно осмыслить, так что позвольте мне поддержать вас. Вот полный код и результат. Обратите внимание, что я сохранил координаты как int, поэтому отрегулируйте соответственно. Я бы, наверное, посоветовал хранить их в виде строк.
let placesRef = self.ref.child("Places")
placesRef.observeSingleEvent(of: .value, with: { snapshot in
for countryChild in snapshot.children { //iterate over each country
let countryChildSnap = countryChild as! DataSnapshot //cast the child to a snapshot
let countryName = countryChildSnap.key //get it's key, the country name
print("country: \(countryName)")
let capitalSnap = countryChildSnap.childSnapshot(forPath: "Capital") //get the nodes within the capital node
for stateChild in capitalSnap.children { //iterate over each state within the country
let stateChildSnap = stateChild as! DataSnapshot
let stateName = stateChildSnap.key
print(" state: \(stateName)")
let coordsSnap = stateChildSnap.childSnapshot(forPath: "Coordinates")
let lat = coordsSnap.childSnapshot(forPath: "latitude").value as! Int
let lon = coordsSnap.childSnapshot(forPath: "longitude").value as! Int
print(" latitude: \(lat) longitude: \(lon)")
}
}
})
и выход
country: America
state: Washington
latitude: 38 longitude: -77
country: France
state: Paris
latitude: 48 longitude: 2
country: Germany
state: Berlin
latitude: 52 longitude: 13
Обратите внимание, что я хочу прочитать это только один раз, поэтому я использую .observeSingleEvent. Если вы хотите получать уведомления о будущих изменениях, используйте .observe с .childAdded, .childChanged и .childRemoved.
@Txo Рад, что помог! Я бы посоветовал прочитать МЕТОДЫ МОДЕЛИРОВАНИЯ ДАННЫХ NOSQL, а также Структурирование вашей Firebase и взглянуть на этот старый пост Массивы злы, потому что люди, плохо знакомые с NoSQL, часто попадают в "роковую яму массивов" и делают много отката вместо того, чтобы вообще их избегать.
Честно говоря, не могу отблагодарить вас, весь день рвал волосы, пытаясь найти полезную информацию, но безрезультатно! Действительно услужливо выложено, так что спасибо! Можете ли вы предложить какие-либо хорошие места для получения информации об использовании Firebase для тех, кто плохо знаком с Firebase и базами данных / JSON?