Как разметить базу данных Firebase

Я хочу знать, как разметить базу данных 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

Как разметить базу данных Firebase

редактировать 1 Нет ли простого способа выполнить цикл for-in вместо простого копирования строки дескриптора и изменения необходимого пути к файлу?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы так близки.

Указанный вами путь (ссылка 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.

Честно говоря, не могу отблагодарить вас, весь день рвал волосы, пытаясь найти полезную информацию, но безрезультатно! Действительно услужливо выложено, так что спасибо! Можете ли вы предложить какие-либо хорошие места для получения информации об использовании Firebase для тех, кто плохо знаком с Firebase и базами данных / JSON?

Txo 26.10.2018 21:03

@Txo Рад, что помог! Я бы посоветовал прочитать МЕТОДЫ МОДЕЛИРОВАНИЯ ДАННЫХ NOSQL, а также Структурирование вашей Firebase и взглянуть на этот старый пост Массивы злы, потому что люди, плохо знакомые с NoSQL, часто попадают в "роковую яму массивов" и делают много отката вместо того, чтобы вообще их избегать.

Jay 26.10.2018 21:21

Другие вопросы по теме