2016-06-01 1 views
11

が動作していませんFirebaseスウィフト:</p> <pre><code>.queryEqualToValue(value: AnyObject?, childKey: String?) </code></pre> <p>2つのこと:</p> <p>1)childKeyが深いパス、単に直接の子を許可していないようだchildKeyによってqueryEqualToValue機能を使って、誰もが任意の運を持っています

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

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

私は、簡単な操作を行う場合は、次の

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

それはすべての投稿を返しません。代わりに、私はラウンドアバウトの道を行う必要があります:

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

それを動作させるには!

私は上記の機能を間違って使用していますか?

+0

最後のスニペットが正しいように見えます。最初のスニペットは常に人々のトラブルを引き起こしているので、私はそれを無視する傾向があります。 –

+0

私は 'queryOrderedByChild(" ")。queryEqualToValue(" ")'をすべて得ることができません! – Learn2Code

答えて

6

のXcode 7.2.1
スウィフト2.1.1
のiOS 9.2
OSX 10.10.5

2)私はそれがすべてで動作させることはできません!私の構造を考える:

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

私は、簡単な操作を行う場合は、次の

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:

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").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のすべてのデータを削除します。

を編集してください。さて、私の観察者と何が起こっているのか分かりました。 Retrieve Dataセクションによれば:

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

以下がFirebaseドキュメントに書かれている:選択された順序によって方法に応じて指定されたキー、値、または優先順位に等しい

queryEqualToValueリターン商品を、。

Retrieve Data on iOS

重要な部分である:"選択された順序によって方法に応じ。"

ですから、ORDERBY方法 - とqueryEqualToValue方法 - を組み合わせて、確認してください。例えば

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-ガイドに記載されていません。

関連する問題

 関連する問題