我一边打字一边搜索用户。但是最后它返回每个用户。 我不知道为什么会这样。好像还行
class func findUsers(text: String)->[User]{
let user = User()
var users = [User]()
ref.child("Users").queryOrderedByChild("name").queryStartingAtValue(text).observeEventType(.Value, withBlock: { snapshot in
for u in snapshot.children{
user.name = u.value!["name"] as? String
user.surname = u.value!["surname"] as? String
user.email = u.value!["email"] as? String
user.score = u.value!["score"] as? Int
user.status = u.value!["status"] as? Int
user.id = u.value!["id"] as? String
user.pin = u.value!["pin"] as? String
users.append(user)
print(user.name)
}
})
print("users:", users)
return users
}
最佳答案
您正在使用 queryStartingAtValue
。来自documentation :
The
FIRDatabaseQuery
instance returned byqueryStartingAtValue:childKey
will respond to events at nodes with a value greater than startValue, or equal to startValue and with a key greater than or equal to childKey.
因此请记住,如果您搜索用户的 name
,它会给出名称按字母顺序排列大于给定用户的所有用户。您需要设置一个queryEndingAtValue
来限制查询范围。
ref.child("Users").queryOrderedByChild("name").queryStartingAtValue(text).queryEndingAtValue(text+"\u{f8ff}")
Firebase legacy documentation是了解 firebase 如何处理查询的好资源。在那里你会发现:
The f8ff character used in the query above is a very high code point in the Unicode range. Because it is after most regular characters in Unicode, the query matches all values that start with a b.
您可能还会对 Elasticsearch 感兴趣. Flashlight是一个集成elasticsearch和firebase的节点服务。
更新:
正如评论中所指出的那样,如果您要搜索的字符串包含大写字符,则此方法将不起作用。在这种情况下,解决方案是在对象中有一个附加字段,其中包含您正在搜索的所有小写信息。因此,如果您将 Satoshi Nakamoto
作为 name
,您将使用 satoshi nakamoto
保存一个额外的 nameSearch
属性。
最后确保您的搜索字符串也是小写的。
您的代码还有其他一些问题。
您正在设置观察者。它会在您的数据更改时随时触发回调,因此您应该在回调内重置
users
数组,这样您就不会拥有重复和脏数据。您的函数不会返回用户数据,因为 firebase 调用是异步的。当您调用
return users
时,您不会填充 users 数组。我建议您使用self.users = users
而不是在函数中返回它。否则,如果你想继续当前的方法并返回它,你应该设置一个 completion handler .
class func findUsers(text: String)->Void{
ref.child("Users").queryOrderedByChild("name").queryStartingAtValue(text).queryEndingAtValue(text+"\u{f8ff}").observeEventType(.Value, withBlock: { snapshot in
var user = User()
var users = [User]()
for u in snapshot.children{
user.name = u.value!["name"] as? String
...
users.append(user)
}
self.users = users
})
}
关于Swift - 数据库中的 Firebase 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38274568/