iOS — запрос фильтра Firebase

У меня есть узел оценки в Firebase:

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

{
"jjTO29ziQ2SjrH5PFzY7ZMpSgjq1-Kak6FCyGtdy_kcEPd4K" =     {
    jjTO29ziQ2SjrH5PFzY7ZMpSgjq1 = "-Kak6FCyGtdy_kcEPd4K";
    score = 5;
};
"jjTO29ziQ2SjrH5PFzY7ZMpSgjq1-KbE_pgfUsukOm4uW0bx" =     {
    jjTO29ziQ2SjrH5PFzY7ZMpSgjq1 = "-KbE_pgfUsukOm4uW0bx";
    score = 4;
};

Вопрос. Можно ли отфильтровать данные по баллам?

Я пытался сделать:

FIRDatabase.database().reference().child("scores").queryOrdered(byChild: "score").observeSingleEvent(of: .value, with: { (snapshot) in

        debugPrint(snapshot.value ?? "nil")

    })

Но не можете получить результат?

Изображение 1


person user3804063    schedule 25.01.2017    source источник
comment
Вы можете фильтровать данные с помощью orderByChild, но я думаю, что ваша проблема в том, что вы ввели соответствующие узлы, внутри которых есть оценка. Потому что вы вводите баллы в начале как ребенок, но сначала вам нужно ввести каждый из ваших идентификаторов.   -  person Mago Nicolas Palacios    schedule 25.01.2017
comment
В чем проблема? Вызывается ли debugPrint?   -  person Frank van Puffelen    schedule 25.01.2017
comment
@MagoNicolasPalacios: у меня настроен узел, как на картинке 1? Можете ли вы предложить какой-нибудь?   -  person user3804063    schedule 25.01.2017
comment
@FrankvanPuffelen: да, отладочная печать вызывается, но данные не сортируются по количеству баллов   -  person user3804063    schedule 25.01.2017
comment
Но ты понял, что я сказал? Вы вводите оценки, а затем фильтруете по оценке, и у оценок нет прямого дочернего элемента с именем score, у него есть 2 разных дочерних элемента, внутри которых есть значение, называемое score.   -  person Mago Nicolas Palacios    schedule 25.01.2017
comment
@MagoNicolasPalacios: да, вы правы, у меня нет прямой дочерней оценки. Я должен фильтровать. Могу ли я достичь этого?   -  person user3804063    schedule 25.01.2017
comment
Вы можете! Я думаю, что ответ ниже правильный. (Фрэнк ван Паффелен)   -  person Mago Nicolas Palacios    schedule 25.01.2017


Ответы (1)


Когда вы выполняете запрос к Firebase, вы получаете FIRDataSnapshot, который содержит три части информации для каждого результата:

  • его ключ
  • его значение
  • его положение относительно других узлов

Когда вы вызываете snapshot.value, снимок преобразуется в словарь. К сожалению, этот словарь может содержать только пары ключ-значение, поэтому вы теряете информацию о положении узлов. Таким образом, хотя данные в моментальном снимке на самом деле отсортированы правильно, вы выбрасываете эту информацию.

Решение состоит в том, чтобы использовать встроенное свойство FIRDataSnapshots children для перебора дочерних узлов в правильном порядке. В документации Firebase по запросам есть пример того, как сделай это:

_commentsRef.observeEventType(.Value, withBlock: { snapshot in
  for child in snapshot.children {
    ...
  }
})
person Frank van Puffelen    schedule 25.01.2017