Проблемы с чтением нескольких дочерних узлов (Firebase) - PullRequest
1 голос
/ 22 мая 2019

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

1 Ответ

1 голос
/ 22 мая 2019

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

  "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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...