问题 Firebase Swift:childKey的queryEqualToValue不起作用


有没有人有运气使用该功能:

.queryEqualToValue(value: AnyObject?, childKey: String?)

两件事情:

1)childKey似乎不允许深路径,只是直接的孩子

2)我根本无法工作!鉴于我的结构:

"post": {
  "groupName": "hello world"
}

如果我做一个简单的:

postRef.queryEqualToValue("hello world", childKey: "groupName").observeSingleEvent( ... )

它根本不会返回任何帖子。相反,我必须采取以下方式:

postRef.queryOrderedByChild("groupName").queryEqualToValue("hello world").observeSingleEvent( ... )

让它工作!

我是否错误地使用了上述功能?


3329
2018-06-01 19:21


起源

最后一个片段看起来是正确的。第一个片段总是给人们带来麻烦,所以我倾向于忽略它。 - Frank van Puffelen
我无法得到 queryOrderedByChild("").queryEqualToValue("") 工作!? - Learn2Code


答案:


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")
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上的所有数据。

编辑:好的,我想我知道观察员发生了什么。根据 检索数据 部分:

通过将异步侦听器附加到a来检索Firebase数据    FIRDatabase参考 FIRDatabaseReference。初始触发器将被触发一次   数据状态以及数据随时变化的情况。

当我尝试观察查询时,回调中的快照中没有任何数据。另一方面,当我观察一个 FirDatabaseReference 观察者(有点)像我期望的那样工作。

例如,如果我观察FIRFatabaseReference,如下所示:

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>

6
2018-06-04 09:16





以下内容写在Firebase文档中:

queryEqualToValue 返回等于指定键,值或优先级的项目,具体取决于所选的order-by方法。

在iOS上检索数据

重要的是: “取决于所选择的订购方式。”

所以请确保,你结合了 queryEqualToValue-Method with a 排序依据-方法。

例如:

    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)
        }
    })

PS:与变种 childKey 新的Firebase iOS指南中未提及。


6
2018-06-16 12:25