【发布时间】:2019-04-09 06:48:27
【问题描述】:
当我查询特定孩子时,我会返回所有结果,而不是特定于我正在寻找的结果:
例如,如果我的搜索文本以字母“c”开头,我应该只从下面得到猫和牛,但由于某种原因,我也得到了公牛。
root
|
@---users
|
@---uid_1000
| |--uid: "uid_1000"
| |--username: "bull"
|
@---uid_2000
| |--uid: "uid_2000"
| |--username: "cat"
|
@---uid_3000
|--uid: "uid_3000"
|--username: "cow"
我在想问题可能是因为我似乎在用户节点(字典复数)上抓取了所有内容,然后遍历可能是问题的字典,但后来我意识到它应该仍然只是用户名值以开头应该出现在字典中开头的字母“c”,而公牛应该被跳过。
我哪里出错了?
let searchText = "c"
let ref = Database.database().reference().child("users")
.queryOrdered(byChild: "username")
.queryStarting(atValue: searchText)
.queryEnding(atValue: searchText + "\u{f8ff}")
ref?.observeSingleEvent(of: .value, with: { (snapshot) in
if !snapshot.exists() { return }
// dictionaries plural
guard let dictionaries = snapshot.value as? [String: Any] else { return }
dictionaries.forEach({ (key, value) in
guard let dict = value as? [String: Any] else { return }
let user = User(dict: dict)
let isContained = self.users.contains(where: { (containedUser) -> Bool in
return user.uid == containedUser.uid
})
if !isContained {
self.users.append(user)
self.collectionView.reloadData()
}
})
根据 Frank 的要求更新了 Json:
{
"users" : {
"1000" : {
"userId" : "1000",
"username" : "bull"
},
"2000" : {
"userId" : "2000",
"username" : "cat"
},
"3000" : {
"userId" : "3000",
"username" : "cow"
}
}
}
要匹配的图片。我从 json 中排除了其他 2 个对象,因为即使它们出现在我的最后(我实际上得到了 5 个结果),我只想专注于问题中的前 3 个。
【问题讨论】:
-
据我所知,您在代码中添加了正确的过滤器,并且应该只获取其
username属性以c开头的子节点。你可以试试这个简化版:let ref = Database.database().reference().child("users") .queryOrdered(byChild: "username") .queryStarting(atValue: "c") .queryEnding(atValue: "d")? -
我刚试了你的简化版,同样的事情发生了,三个都被退回了。
-
以下是我的规则,如果它有什么不同的话: "users": { ".read": "auth.uid != null", ".indexOn": ["username"], "$ uid": { ".write": "$uid === auth.uid" }
-
规则只决定是否返回结果,而不是what返回结果。您可以发布文字 JSON(作为文本,没有屏幕截图),所以我可以试一试?您可以通过单击Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。
-
您需要来自所有其他节点的所有数据吗?我有 19 个具有不同信息的节点。除非你真的需要,否则会很混乱
标签: ios swift firebase firebase-realtime-database