Как запросить данные firebase childByAutoID?

Можно ли запросить этот путь в только один раз и упорядочить элементы по значению locality (например, Лондон), но получить только те элементы, которые начинаются/заканчиваются в определенном childByAutoID?

Причина -, когда я прокручиваю вниз в tableView, я хочу получить из базы данных более старые элементы, упорядоченные по определенной области, например, Лондон и старше, чем oldestKey, который является ключом элемента мультимедиа.

Первая партия элементов загружается изначально с использованием метода .childAdded.

Данные:

 media
   -LgSsaqYzevONPTk2447 // <- childByAutoID
       caption: "12"
       locality: "City of London"
       mediaUID: "-LgSsaqYzevONPTk2447"

  -LgSsZnpSNLJwZBNgXGJ
       caption: "15"
       locality: "New York"
       mediaUID: "-LgSsZnpSNLJwZBNgXGJ"

Код

   class func observeNewMediaSingleTime(_ oldestKey: String,_ 
  userLocality: String, _ completion: @escaping ([Media], String?) -> Void) {


   let ref = Database.database().reference()
     let query = ref.child("media").queryOrdered(byChild: userLocality).queryStarting(atValue: oldestKey).queryLimited(toLast: 50)


 ref.observeSingleEvent(of: .value, with: { snapshot in

    guard snapshot.exists() else {
        completion([],nil)
        return}

     let firstItem = snapshot.children.allObjects.first as! DataSnapshot

      var arrayOfMedia = [Media]()

     var count = 0
     let enumerator = snapshot.children
     while let mediaItem = enumerator.nextObject() as? DataSnapshot {
        let media = Media(dictionary: mediaItem.value as! [String:Any])

        print("media.locality is \(media.locality)")
        //check if new media has same key as oldest post downloaded in previously
        if media.mediaUID != oldestKey{
            count += 1
            arrayOfMedia.append(media)
        }
    }//end of while
    arrayOfMedia.reverse()

    if count == arrayOfMedia.count {
        let updatedOldestKey = firstItem.key
        completion(arrayOfMedia, updatedOldestKey)
    }

})
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы знаете значение locality первого элемента, это возможно с помощью queryStarting(atValue:childKey:):

let query = ref.child("media")
  .queryOrdered(byChild: "locality")
  .queryStarting(atValue: "City of London", childKey: "-LgSsaqYzevONPTk2447")
  .queryLimited(toLast: 50)

Таким образом, приведенное выше упорядочивает все дочерние узлы по их местонахождению, а затем начинает возвращать результаты с помощью locality="City of London" и ключа -LgSsaqYzevONPTk2447.

Это явно не делает то, что должно делать. Несмотря на то, что в базе данных сохранено 20 элементов, где locality == "City of London", он загружает элементы с другими областями. Просто ради этого примера я сохранил 20 элементов один за другим с одинаковым значением местоположения, и он извлекает данные из других городов .... Я не знаю, что делать. imgur.com/LEXwg8l

bibscy 03.06.2019 22:34
.queryStarting(atValue: "City of London"начинается для тех, у кого "City of London", но продолжает возвращать дочерние элементы с другими значениями locality. Если вы этого не хотите, вам тоже нужно queryEnding(atValue: ....
Frank van Puffelen 03.06.2019 22:44

Я только что узнал, что во время тестирования. Терпение — это добродетель, которой могут овладеть лишь немногие, и сегодня я исчерпал его; моя вина. Большое спасибо. Я действительно ценю твою помощь.

bibscy 03.06.2019 22:51

Одна проблема. Он извлек около 30 элементов из базы данных, но больше не извлекает данные, хотя их много. Я использовал ...queryOrdered(byChild: "locality").queryEnding(atValue: userLocality, childKey: oldestKey), где locality == «Лондонский Сити», а childKey всегда является ключом первого ранее загруженного элемента. Я заметил, что он загрузил некоторые элементы с locality == Buckinghamshire, но теперь он не загружает больше, хотя у них одинаковое название местоположения. Он тянет 1, но не 2. imgur.com/a/1rx7pkG . Этим последним предметам 6 месяцев.

bibscy 03.06.2019 23:44

Если вы заказываете дочерние узлы на locality, то "Buckinghamshire" будет до"City of London". Поэтому, если вы начнете с «Лондонского Сити», вы не получите дочерние узлы с Бакингемширом.

Frank van Puffelen 03.06.2019 23:59

Это действительно звучит так, как будто вы хотите заказать по ключу, затем начать с определенного ключа, а затем вернуть оттуда результаты. Если это то, что вы хотите, вам придется отсортировать их на locality стороне клиента.

Frank van Puffelen 03.06.2019 23:59

Давайте продолжить обсуждение в чате.

bibscy 04.06.2019 00:00

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