通过用户名在Firebase数据库中搜索用户?

时间:2018-10-18 18:31:31

标签: swift firebase firebase-realtime-database querying

我正在尝试创建一个搜索功能,该功能通过Firebase数据库中的用户名查询用户,但是我希望该功能仅返回具有在搜索栏中键入的确切用户名(字母)的用户。因此可以说,如果我在搜索栏中输入Mike并点击“搜索”,那么我不希望它返回任何内容,除非有一个使用此确切用户名(Mike)的用户。

非常感谢你们改善我的搜索功能的任何帮助,谢谢!

这是我的功能:

 var REF_USERS = Database.database().reference().child("users")           

 func searchQueryUsers(text: String, completion: @escaping (theUsers) -> Void) {
        REF_USERS.queryOrdered(byChild: "username").queryStarting(atValue: text).observeSingleEvent(of: .value, with: {
            snapshot in
            snapshot.children.forEach({ (sss) in
                let child = sss as! DataSnapshot
                if let dict = child.value as? [String: Any] {
                    let user = theUsers.setUser(dict: dict, key: child.key)
                    completion(user)
                }
            })
        })

    }

1 个答案:

答案 0 :(得分:0)

检查:

func searchQueryUsers(text: String, completion: @escaping (_ userNames: [String]) -> Void) {

    var userNames: [String] = []

    REF_USERS.queryOrdered(byChild: "username").queryStarting(atValue: text).observeSingleEvent(of: .value, with: { snapshot in

        for item in snapshot.children {

            guard let item = item as? DataSnapshot else {
                break
            }

            //"name" is a key for name in FirebaseDatabese model
            if let dict = item.value as? [String: Any], let name = dict["name"] as? String {
                userNames.append(name)
            }
        }

        completion(userNames)
    })
}

因此,您将获得一个名称列表。

但是如果只需要1个名称,请使用:

let nameOfFirstUser: String = userNames.first

为什么要获取整个名称列表更好?

例如,在您的数据库中,可能有这样的名称:Mike,Michel ...

如果您在searchBar中输入“ Mi”,则名字和名字都将与您的搜索查询匹配。