Ios Firebase Swift:childKey的QueryQualtOvalue不起作用
是否有人有幸使用该功能:Ios Firebase Swift:childKey的QueryQualtOvalue不起作用,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,是否有人有幸使用该功能: .queryEqualToValue(value: AnyObject?, childKey: String?) 两件事: 1) childKey似乎不允许深入路径,只允许直接子级 2) 我根本无法让它工作!鉴于我的结构: "post": { "groupName": "hello world" } 如果我做一个简单的例子: postRef.queryEqualToValue("hello world", childKey: "groupName").obser
.queryEqualToValue(value: AnyObject?, childKey: String?)
两件事:
1) childKey似乎不允许深入路径,只允许直接子级
2) 我根本无法让它工作!鉴于我的结构:
"post": {
"groupName": "hello world"
}
如果我做一个简单的例子:
postRef.queryEqualToValue("hello world", childKey: "groupName").observeSingleEvent( ... )
postRef.queryEqualToValue("hello world", childKey: "groupName")
postRef.queryEqualToValue("hello world", childKey: "groupName").observeSingleEvent( ... )
它根本不返回任何帖子。相反,我必须采取迂回的方式:
postRef.queryOrderedByChild("groupName").queryEqualToValue("hello world").observeSingleEvent( ... )
让它工作起来
我是否错误地使用了上述功能?Xcode 7.2.1Swift 2.1.1
iOS 9.2
OSX 10.10.5 2) 我根本无法让它工作!鉴于我的结构:
"post": {
"groupName": "hello world"
}
如果我做一个简单的例子:
postRef.queryEqualToValue("hello world", childKey: "groupName").observeSingleEvent( ... )
postRef.queryEqualToValue("hello world", childKey: "groupName")
postRef.queryEqualToValue("hello world", childKey: "groupName").observeSingleEvent( ... )
我可以使用以下代码成功获取查询:
import UIKit
import Firebase
class ViewController: UIViewController {
var dbRef: FIRDatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
dbRef = FIRDatabase.database().reference()
dbRef.child("post").child("groupName").setValue("hello world")
let postRef = dbRef.child("post")
print(postRef)
let query = postRef.queryEqualToValue("hello world", childKey: "groupName")
print(query)
--output:--
(/post {
en = groupName;
ep = "hello world";
sn = groupName;
sp = "hello world";
})
1) childKey似乎不允许深入路径,只允许直接路径
孩子们
我没看到。如果我将代码更改为:
import UIKit
import Firebase
class ViewController: UIViewController {
var dbRef: FIRDatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
dbRef = FIRDatabase.database().reference()
dbRef.child("post").child("groupName").child("userId").setValue("hello world")
let postRef = dbRef.child("post")
print(postRef)
let query = postRef.queryEqualToValue("hello world", childKey: "userId")
print(query)
我得到以下输出:
(/post {
en = userId;
ep = "hello world";
sn = userId;
sp = "hello world";
})
然而,我无法让观察员工作——他们肯定不像医生说的那样工作
在运行应用程序之前,我会删除Firebase上的所有数据
编辑:好的,我想我知道我的观察者在做什么。根据该节:
Firebase数据是通过将异步侦听器附加到
FIRDatabase引用FIRDatabase引用。侦听器在初始设置时触发一次
数据状态,并在数据更改时再次显示
当我尝试观察查询时,回调中的快照中没有任何数据。另一方面,当我观察FirDatabaseReference
时,观察者的工作(有点)与我预期的一样
例如,如果我观察到FIRDatabaseReference,如下所示:
import UIKit
import Firebase
class ViewController: UIViewController {
var dbRef: FIRDatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
dbRef = FIRDatabase.database().reference()
dbRef.child("post").child("groupName").child("userId").setValue("hello world")
let postRef = dbRef.child("post")
postRef.observeEventType(.Value, withBlock: { (snapshot) -> Void in
print(snapshot)
})
sleep(1) //Allow the observer (in another thread) to execute before the following line:
dbRef.child("post").child("groupName").child("userId").setValue("goodbye Mars")
}
然后回调中的快照包含数据,我得到以下输出:
Snap (post) {
groupName = {
userId = "hello world";
};
}
Snap (post) {
groupName = {
userId = "goodbye Mars";
};
}
但如果我观察FIRDatabaseQuery:
let postRef = dbRef.child("post")
let query = postRef.queryEqualToValue("hello world", childKey: "userID")
query.observeEventType(.Value, withBlock: { (snapshot) -> Void in
print(snapshot)
})
那么输出是:
Snap (post) <null>
Snap(post)
Firebase文档中编写了以下内容:
queryEqualToValue根据所选的排序方法,返回与指定键、值或优先级相等的项
重要的部分是:“取决于所选方法的顺序。”
因此,请确保将queryEqualToValue-方法与orderBy-方法相结合
例如:
let groupState = "open"
ref.child("groups").queryOrdered(byChild:"state").queryEqual(toValue:groupState).observe(enventType: .value, with: { snapshot in
// Returns all groups with state "open"
for group in snapshot.children {
print(group)
}
})
注:新版Firebase iOS指南中没有提到带有childKey的变体。最后一段代码看起来是正确的。第一个片段总是给人们带来麻烦,所以我倾向于忽略它。我根本无法让
queryorderdbychild(“”)。queryqualtovalue(“”)
工作!?childKey变体是否已弃用?这似乎不起作用