Firebase Swift: queryEqualToValue byKeyKey не работает

Кому-нибудь повезло с помощью функции:

.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( ... )

чтобы заставить его работать!

Я использую указанную выше функцию неправильно?

Ответ 1

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, прежде чем запускать приложение.

Изменить. Хорошо, я думаю, что знаю, что происходит с моими наблюдателями. В разделе Получить данные:

Данные Firebase извлекаются путем присоединения асинхронного прослушивателя к Ссылка на FIRDatabase FIRDatabaseReference. Слушатель запускается один раз для начальной состояние данных и снова в любое время при изменении данных.

Когда я пытаюсь выполнить запрос, моментальный снимок в обратном вызове не содержит никаких данных. С другой стороны, когда я наблюдаю a 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>

Ответ 2

В документации Firebase написано следующее:

queryEqualToValue Возвращает элементы, равные указанному ключу, значению или приоритету, в зависимости от выбранного порядка.

Получить данные в iOS

Важная часть: "в зависимости от выбранного порядка.

Итак, убедитесь, что вы комбинируете queryEqualToValue -Method с orderBy -Method.

Например:

    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 не упоминается в новых iOS-руководствах Firebase.