2017-11-12 3 views
-4

からマイコードクラッシュFirebase

let ref = Database.database().reference().child("PostInfo") 
    let query = ref.queryOrdered(byChild: "post_title").queryEqual(toValue: self.retrieve_title) 
    query.observeSingleEvent(of: .value) { (snapshot) in 
     print((snapshot.childSnapshot(forPath: "status").value as? String)!) 
    } 
} 

JSONデータ

 {"PostInfo":{ 
    "-KyjkkEAZeHLjdRLg20w" : { 
     "postImage" : "https://firebasestorage.googleapis.com/v0/b/hobbyquest-ee18d.appspot.com/o/8C40BA04-6D8D-4A23-B8BB-E1B3AC64E66F.png?alt=media&token=3f0f10e3-a64b-4187-9259-3c25bfc4a9e5", 
     "post_title" : "hahahahah", 
     "status" : "a banana an", 
     "threadForHobby" : "Bowling", 
     "userID" : "ccuvHt6feYVIO6GUXKo3OpO6VUn2"} 
     } 

をデータを取得しながら、私はfirebaseからステータスデータを取得しようとしていますが、アプリがクラッシュし。助けてください!

+0

はコードではありませんあなたのコード – Luzo

+0

マイトの写真を追加それは 'ref.queryOrdered(byChild: "post_title")とPostInfoに' post_title "という子がないということだけです。 '-KyjkkEAZeHLjdRLg20w' –

答えて

2

問題は、このラインはあなたのコードを読んでいる

(snapshot.childSnapshot(forPath: "status").value as? String)! 

です値は.valueです。

.valueは、指定されたノード内のすべてのノードを返し、それらを反復処理する必要があります。例えば。当社のデータベースには、次の、あなたのクエリを実行している場合、それらの両方が

をTITLE_0ているため、post_0とpost_2の両方が必要になり返されるTITLE_0

PostInfo 
    post_0 
    postImage = "www.thing.com" 
    status = "status_0" 
    post_title = "title_0" 
    post_1 
    postImage = "www.yipee.com" 
    status = "status_1" 
    post_title = "title_1" 
    post_2 
    postImage = "www.dude.com" 
    status = "status_2" 
    post_title = "title_0" 

のPOST_TITLEとポストのために照会されているように見えると仮定スナップショットを繰り返して結果を取得します。

let ref = self.ref.child("PostInfo") 
    let query = ref.queryOrdered(byChild: "post_title").queryEqual(toValue: "title_0") 
    query.observeSingleEvent(of: .value) { (snapshot) in 
     for child in snapshot.children { 
      let snap = child as! DataSnapshot 
      let x = (snap.childSnapshot(forPath: "status").value as? String)! 
      print(x) 
     } 
    } 

あなたが気付いた場合 - それは別のスナップショットとしてそれぞれの子を検査しているため、コードのあなたの行は、このシナリオで動作します。一方

、あなただけの最初のマッチを返すようにしたい場合は、あなただけの個々のノードを返しますどの.childAddedを、使用することができます。

let ref = self.ref.child("PostInfo") 
    let query = ref.queryOrdered(byChild: "post_title").queryEqual(toValue: "title_0") 
    query.observeSingleEvent(of: .childAdded) { (snapshot) in 
      let x = (snapshot.childSnapshot(forPath: "status").value as? String)! 
      print(x) 
    } 
+0

大きな説明Jay! –

1

私は理由はわかりませんが、データのレイアウトを変更して別の方法で変更できます。

{"PostInfo":{ 
    "searchidentifier" : { //whatever identifier you want, I think you're trying to use the post title 
      "object" : { 
       "postImage" : "https://firebasestorage.googleapis.com/v0/b/hobbyquest-ee18d.appspot.com/o/8C40BA04-6D8D-4A23-B8BB-E1B3AC64E66F.png?alt=media&token=3f0f10e3-a64b-4187-9259-3c25bfc4a9e5", 
       "post_title" : "hahahahah", 
       "status" : "a banana an", 
       "threadForHobby" : "Bowling", 
       "userID" : "ccuvHt6feYVIO6GUXKo3OpO6VUn2"} 
    } 
} 

そして、あなたはこのようなあなたのデータを取得することができます。:

データは次のようになります

let ref = Database.database().reference().child("PostInfo").child("\(self.retrieve_title)") 

ref.observe(.value, with: { (snapshot) in 
    if snapshot.childrenCount > 0 { 
      for classes in snapshot.children.allObjects as![FIRDataSnapshot] { 
       let classesObject = classes.value as? [String: AnyObject] 
       let postImage = classesObject?["postimage"] 
       //Retrieve all the other objects here as well 
      } 
     } 
}) 
関連する問題