即使添加indexOn之后,Firebase安全规则仍继续询问“考虑添加“ .indexOn”:“

时间:2020-09-15 22:17:18

标签: swift firebase firebase-realtime-database firebase-security

我添加了一个功能来在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)
        }
    }

这是我的数据库结构:

enter image description here

因此searchUser函数起作用,但是xcode控制台继续要求.indexOn作为用户名。

为什么这里出问题了?

1 个答案:

答案 0 :(得分:1)

需要在查询中使用的位置上定义索引。因此,要使用每个子节点的/users属性在username上定义索引:

  "users" : {
    ".indexOn" : "username"
  }