我想从每个用户名值中搜索我的用户群。根据我所看到的,在线人们经常会返回所有用户,然后在表格视图中对其进行过滤,但这看起来既不实际也不可行。我的想法是查询数据并返回指数级较小的值数组,但我无法使用提供的查询方法。
如何查询数据库的特定方面?
如何构建我的代码以使其可行;没有加载到每个用户,一次最多10个。
非常感谢任何建议,资源和链接。
修改
我做了一些研究,看起来Firebase附带了一些内置的查询方法......到目前为止,这是我尝试使用下面的代码测试它以打印出以I开头的用户,但是我无法在控制台中打印任何用户
ref.queryOrderedByKey().queryStarting(atValue: "I").queryEnding(atValue: "I\u{f8ff}")
.observe(.childAdded, with: { snapshot in
print(snapshot.key)
})
答案 0 :(得分:1)
有许多解决方案,并且经常加载所有用户数据的数据太多。
这是一个典型的用户节点
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开头的所有值。