Firebase не возвращает данные

# #json #swift #firebase #firebase-realtime-database

Вопрос:

У меня есть следующий быстрый код для извлечения данных из базы данных Firebase в реальном времени:

     private let db = Database.database().reference(withPath: "food")

    func fetchFoods() {
        db.getData(completion: { error, snapshot in
            guard error == nil else {
                print("ERROR")
                print(error!.localizedDescription)
                return
            }
            print(snapshot.value as? String ?? "Unknown")
            // Food data is stored as a map of UUIDs to Food objects
            guard let foodDicts = snapshot.value as? [String: Any] else {
                print("ERROR: type cast failed")
                return
            }
        })
    }
 

Но у меня возникла странная проблема, где, если мои данные хранятся как таковые:

 {
  "food": [{
      "id": "8466A419-AE6E-4997-BE74-220B59C95F96",
      "cholestrol": 0,
      "macroProfile": {
        "carbProfile": {
          "sugar": 0,
          "fiber": 0
        },
      ...
  }]
}

 

Нет никаких проблем с получением данных. Однако, если данные хранятся как таковые:

 {
  "food": {
      "8466A419-AE6E-4997-BE74-220B59C95F96": {
        "cholestrol": 0,
        "macroProfile": {
          "carbProfile": {
            "sugar": 0,
            "fiber": 0
          },
        ...
      }
   }
}
 

Я получаю:

 Unable to get latest value for query FQuerySpec (path: /, params: {
}), client offline with no active listeners and no matching disk cache entries
 

Комментарии:

1. Покажите дерево набора данных в виде изображения.

Ответ №1:

Я исправил это, отредактировав database.rules.json и установив для правил чтения и записи значение true.

 {
  "rules": {
    ".read": true,
    ".write": true
  }
}
 

Теперь, вы можете спросить, почему работал другой формат данных? Потому что он был сохранен в кэше с прошлого раза!! И где-то по пути мой файл правил изменился.