IndexOn в Firebase Root для запроса всей базы данных Swift 3 - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь выполнить запрос по имени в базе данных firebase, я хочу вернуть все имена, соответствующие запросу. Но я не могу заставить его работать, я получаю ошибку Подумайте о добавлении ".indexOn": "name" в / к вашим правилам безопасности .

Правила безопасности:

{
  "rules": {
    ".read": "true",
    ".write": "true",
    "goals_new": {
      ".indexOn": ["name"]
    }
  }
}

Я могу получить имена для конкретного ребенка следующим образом:

let query = ref.child("goals_new").queryOrdered(byChild:"name").queryEqual(toValue: name)
    query.observe(.childAdded) { (snapshot) in

    //  if let values =
        if let values = snapshot.value as? [String:String] {
            print(values)
            print(values["name"]?.count ?? "")

        }
    }

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

Структура базы данных:

"goals_new" : [ null, {
    "name" : "Eric thomas",
    "pic" : “…….”,
    "title" : "Be Obsessed with your Goals",
    "url" : “……”
  }, 
{
    "name" : "Bob Proctor",
    "pic" : “……….",
    "title" : "Goal Achievement System",
    "url" : “………”
  },

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 11 мая 2018

Подумайте о добавлении ".indexOn": "name" в / к своим правилам безопасности <- это всего лишь предупреждение, поэтому вам не нужно об этом беспокоиться. </p>

Я вижу, возможно, ошибку. Похоже, вы используете массив для хранения ваших объектов 'goal_news' из-за того, что ключи имеют номера 1, 2 и т. Д ... Возможно, это портит ваш запрос, вы должны изменить их на строковые ключи, как каждый раз, когда вы добавить метод использования firebase childByAutoID ().

Лучше использовать .value вместо .childAdded, чтобы вы могли получить все объекты, соответствующие имени, что-то вроде этого:

      let query = ref.child("goals_new").queryOrdered(byChild:"name").queryEqual(toValue: name)
query.observe(.value) { (snapshot) in

    guard snapshot.exists() && snapshot.hasChildren() else {return}
    for snap in snapshot.children {
          var currentSnapValue = (snap as! DataSnapshot).value as! [String: String]
         print("Name: \(currentSnapValue["name"])")

    }
 }

Таким образом, вы получаете все объекты, которые соответствуют названию

...