#swift #firebase #firebase-realtime-database #firebase-security
#swift #firebase #firebase-realtime-database #firebase-безопасность
Вопрос:
Я добавил функцию поиска пользователя в firebase. Вот код:
func searchUser(search: String, includeCurrentUser: Bool = true, completion: @escaping ([User]) -> (), withCancel cancel: ((Error) -> ())?) {
Database.database().reference().child("users").queryOrdered(byChild: "username").queryStarting(atValue: search , childKey: "username").queryEnding(atValue: search "u{f8ff}", childKey: "username").observeSingleEvent(of: .value, with: { (snapshot) in
guard let dictionaries = snapshot.value as? [String: Any] else {
completion([])
return
}
var users = [User]()
dictionaries.forEach({ (key, value) in
if !includeCurrentUser, key == Auth.auth().currentUser?.uid {
completion([])
return
}
guard let userDictionary = value as? [String: Any] else { return }
let user = User(uid: key, dictionary: userDictionary)
users.append(user)
})
users.sort(by: { (user1, user2) -> Bool in
return user1.username.compare(user2.username) == .orderedAscending
})
completion(users)
}){ (err) in
print("Failed to fetch all users from database:", (err))
cancel?(err)
}
}
При вызове searchUser в моей консоли Xcode указано:
[Firebase / Database] [I-RDB034028] С использованием неуказанного индекса. Ваши данные будут загружены и отфильтрованы на клиенте. Рассмотрите возможность добавления «.indexOn»: «username» в / users к вашим правилам безопасности для повышения производительности
Вот мои правила firebase:
{
/* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
"rules": {
".read": true,
".write": true,
"posts" : {
".indexOn": "creationDate"
},
"purchaser" : {
"$postID" : {
".indexOn": ".value"
}
},
"users" : {
"$uid": {
".indexOn" : "username"
}
}
}
}
И вот моя структура базы данных:
Таким образом, функция searchUser работает, но консоль xcode продолжает запрашивать .indexOn для имени пользователя.
Почему здесь что-то не так?
Комментарии:
1. Пожалуйста, скопируйте текст правил безопасности в сам вопрос и отформатируйте его как код, вместо того, чтобы показывать картинку.
2. Мои извинения, все изменилось! Спасибо.
Ответ №1:
Индексы должны быть определены в том месте, где вы используете их в своем запросе. Итак, чтобы определить индекс на /users
с username
свойством каждого дочернего узла:
"users" : {
".indexOn" : "username"
}