我添加了一个功能来在Firebase上搜索用户。 这是代码:
Scaffold(
resizeToAvoidBottomInset: false,
body: SingleChildScrollView(
child: SafeArea(
child: Stack(
children: <Widget> [
CustomPaint(),
Column(children: <Widget>[
TextField(),
TextField(),
RaisedButton(),
])
]
)
)
)
)
当调用searchUser时,我的Xcode控制台指出:
[Firebase / Database] [I-RDB034028]使用未指定的索引。您的数据将在客户端上下载并过滤。考虑将/ users处的“ .indexOn”:“用户名”添加到安全规则中,以获得更好的性能
这是我的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控制台继续要求.indexOn作为用户名。
为什么这里出问题了?
答案 0 :(得分:1)
需要在查询中使用的位置上定义索引。因此,要使用每个子节点的/users
属性在username
上定义索引:
"users" : {
".indexOn" : "username"
}