我试图通过" name"来查询我们的LCList对象。值,如in this image所示。名称键位于对象下方的下一级。其他任何值都没有额外的等级。
我用来执行查询的代码是:(记住listsRef指向LCLList对象)
listsRef.queryOrderedByKey()
.queryStarting(atValue: name)
.observeSingleEvent(of: .value, with: { snapshot in
此查询的快照返回时没有任何值。我也试过按名称值排序结果,结果相同。我已经检查了仅使用queryOrderedByKey()方法调用返回的值,它们与数据库中的值匹配。问题显然是.queryStarting(atValue :)方法调用。
我真的很困惑,为什么这不起作用,因为同一个查询指向我们的LCLUser object,结构几乎相同,确实得到了结果。这两个对象存在于"对象"在上一张图片中看到的目录。
此时的任何帮助将不胜感激。我确定有一些简单的东西我不知道。
答案 0 :(得分:0)
该查询不适用于问题中显示的Firebase结构。
您拥有的查询如下,我在每一行都添加了一条评论,详细说明了每行的内容
listsRef.queryOrderedByKey() //<- examine the key of each child of lists
.queryStarting(atValue: name) //<- does that keys' value match the name var
.observeSingleEvent(of: .value, with: { snapshot in //do it once
,您当前的数据如下所示
Objects
LCLLists
node_x
creator: "asdasa"
name: "TestList3"
node_y
creator: "fgdfgdfg"
name: "TestList"
所以这里发生的是将名称var(一个字符串)与每个键(一个字典)的值进行比较,这个值不能相等。 String≠Dictionary
key value
["node_x": [creator: "asad", name: "TestList3"]
要使该查询起作用,您的结构必须像这样
Objects
LCLLists
node_x: "TestList3"
node_y: "TestList"
我的猜测是你想坚持你当前的结构,所以我们想要使用你的结构查询所有'TestList'的名字
let ref = self.ref.child("LCLLists") //self.ref is a class var that references my Firebase
let query = ref.queryOrdered(byChild: "name").queryEqual(toValue: "TestList")
query.observeSingleEvent(of: .value, with: { snapshot in
print(snapshot)
})
,结果是node_y
的打印输出 node_y
creator: "fgdfgdfg"
name: "TestList"