web-dev-qa-db-ja.com

Firebase Swift:childKeyによるqueryEqualToValueが機能していません

関数を使用して誰かが運がありますか?

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

2つのこと:

1)childKeyは深いパスを許可していないようで、直接子を許可するだけです

2)まったく動作しません!私の構造を考えると:

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

私が簡単に行う場合:

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

投稿は一切返されません。代わりに、次のような回り道をする必要があります。

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

それを機能させるために!

上記の関数を間違って使用していますか?

11
leonardloo

Firebaseのドキュメントには次のように書かれています。

queryEqualToValue選択したorder-byメソッドに応じて、指定したキー、値、または優先度に等しいアイテムを返します。

iOSでデータを取得

重要な部分は次のとおりです: "選択した順序による方法によって異なります。"

したがって、必ず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)
        }
    })

PS:childKeyのバリアントは、新しいFirebaseiOSガイドには記載されていません。

7
Blank

Xcode 7.2.1
スイフト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。リスナーは、データの初期状態に対して1回トリガーされ、データが変更されるたびにトリガーされます。

クエリを監視しようとすると、コールバックのスナップショットにデータが含まれていません。一方、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>
6
7stud