【发布时间】:2021-01-02 17:25:05
【问题描述】:
我添加了一个在 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] 使用未指定的索引。您的数据将在客户端下载和过滤。考虑将 /users 处的 ".indexOn": "username" 添加到您的安全规则中以获得更好的性能
这是我的 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 作为用户名。
这里为什么会出错?
【问题讨论】:
-
请将安全规则的文本复制到问题本身并格式化为代码,而不是显示图片。
-
抱歉,一切都变了!谢谢。
标签: swift firebase firebase-realtime-database firebase-security