Когда я запрашиваю конкретного ребенка, я получаю все результаты, а не те, которые относятся к тому, что я ищу:
Например, если мой текст поиска начинается с буквы "c", я должен получить только кошку и корову снизу, но по какой-то причине я также получаю быка.
root
|
@---users
|
@---uid_1000
| |--uid: "uid_1000"
| |--username: "bull"
|
@---uid_2000
| |--uid: "uid_2000"
| |--username: "cat"
|
@---uid_3000
|--uid: "uid_3000"
|--username: "cow"
Я подумал, что, возможно, проблема в том, что я, кажется, собираю все на узле пользователей (множественные словари), а затем перебираю словари, которые могут быть проблемой, но потом я понял, что это должны быть только значения имени пользователя, начинающиеся с буква "с", которая должна появляться внутри словарей, а бык должен быть пропущен.
Где я ошибаюсь?
let searchText = "c"
let ref = Database.database().reference().child("users")
.queryOrdered(byChild: "username")
.queryStarting(atValue: searchText)
.queryEnding(atValue: searchText + "\u{f8ff}")
ref?.observeSingleEvent(of: .value, with: { (snapshot) in
if !snapshot.exists() { return }
// dictionaries plural
guard let dictionaries = snapshot.value as? [String: Any] else { return }
dictionaries.forEach({ (key, value) in
guard let dict = value as? [String: Any] else { return }
let user = User(dict: dict)
let isContained = self.users.contains(where: { (containedUser) -> Bool in
return user.uid == containedUser.uid
})
if !isContained {
self.users.append(user)
self.collectionView.reloadData()
}
})
Обновлено с помощью Json по запросу Фрэнка:
{
"users" : {
"1000" : {
"userId" : "1000",
"username" : "bull"
},
"2000" : {
"userId" : "2000",
"username" : "cat"
},
"3000" : {
"userId" : "3000",
"username" : "cow"
}
}
}
Картинка для соответствия. Я исключил 2 других объекта из json, потому что, хотя они появились на моем конце (у меня на самом деле было 5 результатов), я хотел просто сосредоточиться на том, что в вопросе, который является первым 3.