Firebase实时数据库查询不起作用

时间:2019-05-20 20:55:20

标签: ios firebase firebase-realtime-database filter

我正在尝试检索某些值而不是其他值。实际上,我想按用户名搜索用户。

我尝试使用queryStarting(atValue: input)queryEnding(atValue: "u{f8ff}"),但找不到正确的解决方案。

let input = searchInput.text?.lowercased()
print("Search for \(input!)")
let ref = Database.database().reference().child("Usernames").queryStarting(atValue: input).queryEnding(atValue: "u{f8ff}").queryOrderedByKey()

ref.observeSingleEvent(of: .value) { (snapshot) in
    if snapshot.exists() {
        for users in snapshot.children.allObjects as! [DataSnapshot] {
            let user = users.value as? [String:AnyObject]
            let id = user?["id"] as! String
            Users.init(userId: (id))
            print(users.key)
        }
    }
}

如您所见,我还添加了queryOrderedByKey()。如果我不添加该部分,则它不会检索任何内容。 我想要的只是从我在文本字段中写的内容开始检索值。

Usernames
----- charles
----------id: charles's uid
----- pierre
----------id: pierre's uid
----- bob
----------id: bob's uid
----- lu
----------id: lu's uid

问题是,例如,如果输入为“ L”(以搜索lu),它将检索[lu]。然后,如果输入为“ Bo”(以搜索bob),它将检索[lu]和[bob],而不仅是我想要的[bob]。显然,如果输入为“ C”(用于搜索bob),它将检索[lu],[bob],[pierre],最后是[charles]。

1 个答案:

答案 0 :(得分:0)

您当前的查询以正确的输入开始,但以u{f8ff}结束-这意味着,如果您以bo开头,您还会得到以c,{{1 }}等

您需要做的就是以字符串开头的最大值结尾,例如对于d的输入,您希望以bo结尾。您可以通过将输入与该unicode值(即:

bo\u{f8ff}