我想从每个用户名值搜索我的用户群。从我在网上看到的情况来看,人们经常返回all用户,然后在表视图中过滤它们,但这似乎不实际也不可行。我的想法是查询数据并返回指数较小的值数组,但我在使用提供的查询方法时遇到了麻烦。
如何查询数据库的特定方面?
如何构建我的代码以使其可行;不是每个用户都加载,一次最多 10 个。
非常感谢任何建议、资源和链接。
编辑:
我做了一些研究,看起来 Firebase 附带了一些内置的查询方法...到目前为止,这就是我尝试使用下面的代码来测试它以打印出以 I 开头的用户,但我不能让它在控制台中打印任何用户
ref.queryOrderedByKey().queryStarting(atValue: "I").queryEnding(atValue: "I\u{f8ff}")
.observe(.childAdded, with: { snapshot in
print(snapshot.key)
})
有很多解决方案,但通常加载所有用户数据的数据量太大。
这是一个典型的用户节点
users
uid_0
name: "Jean Luc"
uid_1
name: "Will"
uid_2
name: "Geordi"
一种选择是迭代每个用户节点,一次一个,以检索用户名。这完全避免了庞大的数据集。我们将使用 .childAdded 事件来加载每个事件并将其存储在数组中
let usersRef = self.ref.child("users")
var userNamesArray = [String]()
usersRef.observe(.childAdded, with: { snapshot in
let userDict = snapshot.value as! [String: Any]
let name = userDict["name"] as! String
userNamesArray.append(name)
})
第二个选项是将用户名存储在完全不同的节点中,这可以显着减少“混乱”,因为其余数据保留在主用户节点中
user_names
uid_0: "Jean Luc"
uid_1: "Will"
uid_2: "Geordi"
正如您在这种结构中所看到的,即使有数千个名称,它也只是占用空间非常小的文本。
另一个选项是使用 .startingAt 和 .endingAt 一次加载 X 个用户,并迭代返回的用户以获取每个名称。在这种情况下,我们希望所有以 A 开头并以 M 结尾的用户...抱歉 Worf。
let usersRef = self.ref.child("users")
var userNamesArray = [String]()
let nameQuery = usersRef.queryOrdered(byChild: "name")
.queryStarting(atValue: "A")
.queryEnding(atValue: "M\u{f8ff}")
nameQuery.observe(.value, with: { snapshot in
for child in snapshot.children {
let snap = child as! DataSnapshot
let userDict = snap.value as! [String: Any]
let name = userDict["name"] as! String
userNamesArray.append(name)
}
})
最后一个示例以以 A 开头的用户名开始,以 M + 一个非常高的 unicode 字符结尾的用户名结束,这使得它包含以 M 开头的所有名称
上面查询中使用的 \uf8ff 字符是一个非常高的代码点 在 Unicode 范围内。因为它位于大多数常规字符之后 Unicode,查询匹配所有以 queryString 开头的值。
编辑:2024-06
You may need to use "\u{F8FF}" instead of "\\uf8ff"