IndexOn on firebase Root 查询整个数据库 swift 3.



我正在尝试在Firebase数据库中按名称查询,我想返回与查询匹配的所有名称。但我似乎无法让它工作,我收到错误考虑将".indexOn":"name"添加到您的安全规则中

安全规则:

{
"rules": {
".read": "true",
".write": "true",
"goals_new": {
".indexOn": ["name"]
}
}
}

我可以像这样检索特定孩子的名字:

let query = ref.child("goals_new").queryOrdered(byChild:"name").queryEqual(toValue: name)
query.observe(.childAdded) { (snapshot) in
//  if let values =
if let values = snapshot.value as? [String:String] {
print(values)
print(values["name"]?.count ?? "")
}
}

但是我想检索数据库中与查询匹配的所有名称

数据库结构:

"goals_new" : [ null, {
"name" : "Eric thomas",
"pic" : “…….”,
"title" : "Be Obsessed with your Goals",
"url" : “……”
}, 
{
"name" : "Bob Proctor",
"pic" : “……….",
"title" : "Goal Achievement System",
"url" : “………”
},

任何帮助将不胜感激。

考虑将 ".indexOn": "name" at/添加到您的安全规则中 <- 只是一个警告,因此您不必担心太多。

我看到的可能是错误。看起来您正在使用数组来存储"goals_news"的对象,因为键是数字 1、2 等......也许这会弄乱您的查询,您必须为字符串键更改它们,就像每次添加一个使用 firebase 方法 childByAutoID(( 一样。

最好使用 .value 而不是 .childAdd 方法,这样您就可以获取与名称匹配的所有对象,如下所示:

let query = ref.child("goals_new").queryOrdered(byChild:"name").queryEqual(toValue: name)
query.observe(.value) { (snapshot) in
guard snapshot.exists() && snapshot.hasChildren() else {return}
for snap in snapshot.children {
var currentSnapValue = (snap as! DataSnapshot).value as! [String: String]
print("Name: (currentSnapValue["name"])")
}
}

这样,您就可以获得与名称匹配的所有对象

最新更新