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.1
Swift 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变体是否已弃用?这似乎不起作用