Проблемы с чтением нескольких дочерних узлов (Firebase)

Я очень новичок в Firebase и довольно новичок в Swift, поэтому, пожалуйста, извините за неправильный синтаксис. У меня возникли проблемы с чтением данных, которые находятся под несколькими дочерними узлами в Firebase, данные отображаются, когда они находятся под одним дочерним узлом, но, по сути, при тех же условиях равны нулю, когда я пытаюсь найти их под двумя.

adminClientHandle = ref.child("Test").child("client1").observe(.value, with : { (snapshot) in
            let adminClientStuff = snapshot.value as? [String:String]

            //Goals
            if adminClientStuff?["Goal 1"] != nil {
                self.adminGoal1.text = adminClientStuff?["Goal 1"]
            } else {
                self.adminGoal1.text = "nil"
            }

ref = Database.database().reference() на viewDidLoad

когда база данных firebase выглядит так:

{
  "Test" : {
    "client1" : {
      "Goal 1" : "Goal 1",
      "Goal 1 %" : "100",
      "Goal 1 Correct" : 1,
      "Goal 1 Total" : "1",
      "Goal 2" : "Will keep personal space for 10 minutes",
      "Goal 2 %" : "0",
      "Goal 2 Correct" : 1,
      "Goal 2 Total" : "1",
      "Goal 3" : "Will recall events that happened in the last hour",
      "Goal 3 %" : "0",
      "Goal 3 Correct" : 1,
      "Goal 3 Total" : "1"
    }
  }
}

adminClientStuff?["Goal 1"] возвращает nil, хотя аналогичный код с дочерним узлом возвращает реальную строку. Пожалуйста, дайте мне знать, если я могу что-то упустить, но я много пробовал без желаемого результата.

Пожалуйста, отредактируйте свой вопрос, чтобы включить фрагмент фактического JSON в ref (в виде текста, без скриншотов, пожалуйста). Вы можете получить это, щелкнув ссылку «Экспорт JSON» в дополнительном меню (⠇) на вашем Консоль базы данных Firebase.

Frank van Puffelen 22.05.2019 16:23

Попался только что, спасибо!

staabi10 22.05.2019 16:32

На первый взгляд код выглядит соответствующим JSON, которым вы поделились. Что отображается, когда вы печатаете adminClientStuff?

Frank van Puffelen 22.05.2019 16:47

Похоже, он вообще ничего не возвращает, но я не уверен, почему.

staabi10 22.05.2019 17:25

Хорошо, это означает, что никакие данные не загружаются. Это не может быть проблемой безопасности/авторизации, так как это не вызовет этот обработчик завершения. Единственное, что я могу придумать, это то, что ref не указывает на корень файла JSON, которым вы поделились, поэтому вы можете распечатать этот ref и посмотреть, на что он указывает. Если это не так, я надеюсь, что кто-то еще заметит проблему.

Frank van Puffelen 22.05.2019 17:35

Ладно круто, спасибо за помощь. Я прокомментирую, если выясню, что не так!

staabi10 22.05.2019 19:13
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
6
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Глядя на вашу структуру, в ней есть смесь значений

  "Goal 1" : "Goal 1",
  "Goal 1 %" : "100",
  "Goal 1 Correct" : 1,

так что это не сработает, так как это неоднородная литеральная проблема коллекции

let adminClientStuff = snapshot.value as? [String:String]

Это нужно будет определить так

let adminClientStuff = snapshot.value as? [String:Any]

Я бы также предложил другое решение, которое защищает ваш код в случае, если значение отсутствует или отличается от ожидаемого.

let goal1 = snapshot.childSnapshot(forPath: "Goal 1").value as? String ?? "No Goal value"
let goal1Percent = snapshot.childSnapshot(forPath: "Goal 1 %").value as? String ?? "No Goal value"
let goal1Correct = snapshot.childSnapshot(forPath: "Goal 1 Correct").value as? Int ?? 0
print(goal1, goal1Percent, goal1Correct)

@staabi10 Да! Рад, что помог. Понимание форматов данных иногда может быть пугающим. Если мой ответ помог, обязательно примите его, чтобы он мог помочь другим. Принятие ответов

Jay 22.05.2019 21:24

Я думал, что преобразовал все свои данные в строки при записи в Firebase, но, должно быть, что-то упустил. В любом случае, хороший первый опыт с вопросом о переполнении стека!

staabi10 23.05.2019 16:09

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