2017-10-29 11 views
0

すぐに自ノードによって生成される子ノードの下に格納されているデータを取得する最良の方法を教えてください。 firebaseデータベースの自ノードによって生成された子ノードに格納されたデータを取得する方法は?

構造

book007 
    +---isbn       //1st node 
    +---user       //2nd node 
    +---userBooks      //3rd node 
     | --TikubNudhfiI90uNKIij  //3rd childnode 
     | +-Thuimfim9876HUIhinn . //3rd childnode AutoGeneratedID 
     |  --ThufdsfsYI7ihhuhGGU 
     |   --BookIsbn:"23432423"  //need to get this node 
     | +-ThuisddfsdUUHKIhinn 

コードは、それを行うには良い方法があるはずと私は信じて最適化されていません。

func fetchuser(){ 

     print("Fetching UserBooks!!") 
     guard let uid = Auth.auth().currentUser?.uid else { 
      print("No UID on fetchBook!!") 
      return 
     } 

     Database.database().reference().child("userBooks").child(uid).observe(.childAdded, with: { (ChildKeysnapshot) in 
      let partkey = ChildKeysnapshot.key 
      print("partkey",partkey) 

      // user > keys > all books (godeep = isbneach book) 
     Database.database().reference().child("userBooks").child(uid).child(partkey).observeSingleEvent(of: .value, with: { (isbnShot) in 

       if let DictIsbn = isbnShot.value as?[String:AnyObject]{ 

        let isbnCell = BkCells() 
        isbnCell.setValuesForKeys(DictIsbn) 
        print("New updateISBN OF THIS USER", isbnCell.bookISBN) 
        self.users.append(isbnCell) 
        print("IsbncellIS this",self.users.count) 
       } 

      print("This is Ron Before") 
      self.fetchUserIsbn() 

     }, withCancel: nil) 

     }, withCancel: nil) 
    } 
+0

質問は少し不明です。 「データを取得する」と言ったら、どういう意味ですか?この場合、userBookノードは.childAddedによって監視されています。これにより、新しく追加された子ノード*とそのすべての子データ*がアプリに表示されます。ノード* Thuimfim9876HUIhinn *が追加されたばかりのコードがあるので、その子、* ThufdsfsYI7ihhuhGGU *などの子どものすべてがその子の* BookIsbn *がスナップショットに追加されます。複数の子ノードがあり、それらを操作する方法を尋ねている場合は、それらのノードを独自のスナップショットとして反復処理できます。おそらく少し質問を明確にすると、より良い答えにつながるでしょう。 – Jay

+0

/userBooks/+ -TikubNudhfiI90uNKIij/--Thuimfim9876HUIhinn内に複数の子ノードがありますか?それはThufdsfsYI7ihhuhGGU(/ BookIsbnを含む)です。 – Jay

答えて

0

あなたは、ユーザーの本ノードの下にそれぞれの子のためにトリガされますchildAddedイベントで、ユーザーの本を観察しています。クロージャ内で返されるスナップショットは各書籍のためのものであるため、書籍の値を再度要求する必要はありません。

func fetchuser(){ 

    guard let uid = Auth.auth().currentUser?.uid else { return } 

    let ref = Database.database().reference(withPath: "userBooks/\(uid)") 

    ref.observe(.childAdded, with: { snapshot in 
     if let bookIsbn = snapshot.child("BookIsbn").value as? String { 
      print(bookIsbn) 
     } 
    }, withCancel: nil) 
} 

1はDataSnapshot経由で初期化することができるように、BkCellsモデルに変更を加える必要があります。

import Firebase 

class BkCells: NSObject { 

    var bookIsbn: String! 

    init?(snapshot: DataSnapshot) { 

     guard 
      let bookIsbn = snapshot.child("BookIsbn").value as? String 
     else { 
      return nil 
     } 

     self.bookIsbn = bookIsbn 
    } 
} 

あなたは、ユーザーのuserBooksノードの下に各書籍のスナップショットBkCellインスタンスを作成することができます。

ref.observe(.childAdded, with: { snapshot in 
    if let bkCells = BkCells(snapshot: snapshot) { 
     print(bkCells.bookIsbn) 
    } 
}, withCancel: nil) 
+0

はそれを理解しましたが、Bookisbnの価値を得ることはできませんでしたか? intと述べたように数字と質問 – Vj7

+0

@ Vj7私の更新を試してみてください – Callam

関連する問題