関数を使用して誰かが運がありますか?
.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( ... )
それを機能させるために!
上記の関数を間違って使用していますか?
Firebaseのドキュメントには次のように書かれています。
queryEqualToValue選択したorder-byメソッドに応じて、指定したキー、値、または優先度に等しいアイテムを返します。
重要な部分は次のとおりです: "選択した順序による方法によって異なります。"
したがって、必ず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ガイドには記載されていません。
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>