Можно ли запросить этот путь в только один раз и упорядочить элементы по значению 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)
}
})
}





Если вы знаете значение 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.
.queryStarting(atValue: "City of London"начинается для тех, у кого "City of London", но продолжает возвращать дочерние элементы с другими значениями locality. Если вы этого не хотите, вам тоже нужно queryEnding(atValue: ....
Я только что узнал, что во время тестирования. Терпение — это добродетель, которой могут овладеть лишь немногие, и сегодня я исчерпал его; моя вина. Большое спасибо. Я действительно ценю твою помощь.
Одна проблема. Он извлек около 30 элементов из базы данных, но больше не извлекает данные, хотя их много. Я использовал ...queryOrdered(byChild: "locality").queryEnding(atValue: userLocality, childKey: oldestKey), где locality == «Лондонский Сити», а childKey всегда является ключом первого ранее загруженного элемента. Я заметил, что он загрузил некоторые элементы с locality == Buckinghamshire, но теперь он не загружает больше, хотя у них одинаковое название местоположения. Он тянет 1, но не 2. imgur.com/a/1rx7pkG . Этим последним предметам 6 месяцев.
Если вы заказываете дочерние узлы на locality, то "Buckinghamshire" будет до"City of London". Поэтому, если вы начнете с «Лондонского Сити», вы не получите дочерние узлы с Бакингемширом.
Это действительно звучит так, как будто вы хотите заказать по ключу, затем начать с определенного ключа, а затем вернуть оттуда результаты. Если это то, что вы хотите, вам придется отсортировать их на locality стороне клиента.
Давайте продолжить обсуждение в чате.
Это явно не делает то, что должно делать. Несмотря на то, что в базе данных сохранено 20 элементов, где
locality=="City of London", он загружает элементы с другими областями. Просто ради этого примера я сохранил 20 элементов один за другим с одинаковым значением местоположения, и он извлекает данные из других городов .... Я не знаю, что делать. imgur.com/LEXwg8l