2016-10-16 15 views
2

firebaseバックエンドを使用してアプリケーションを作成しています。私は出てきたいデータを保存しています。はい、スナップショットオプションがありますが、この特定のケースでは、URLを通じて情報を取得する方が簡単です。FirebaseからのデータをURL(Swift)で取得する

たとえば、データベースにユーザーがいて、そのユーザーの下にメッセージという名前の特定のノードがあり、そのノードの下に多数のメッセージオブジェクトがあるとします。 Firebaseコンソールでこれらのノードの1つをクリックすると、ボックスの上部への参照が得られます(see picture)。

トップにあるURLから情報を取得し、それをスナップショットとして使用してデータを取得することはできますか?私はこれまでのfirebaseのドキュメントでこれまでに行われてきたことを見てきましたが、私が必要としているものですが、古くて動作しません。 、見ての通り、私はSwift3とXcode 8

// Get a reference to our posts 
var ref = Firebase(url:"https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts") 

// Attach a closure to read the data at our posts reference 
ref.observeEventType(.Value, withBlock: { snapshot in 
    println(snapshot.value) 
}, withCancelBlock: { error in 
    println(error.description) 
}) 

答えて

2

を使用していますhttps://www.firebase.com/docs/ios/guide/retrieving-data.html

あなたLink.child()パラメータ"user"の概要とのIDである:ここで

は、そのドキュメントへのリンクありユーザー/メッセージ:

autoIDをメッセージ辞書に保存すると、それを参照できるようになり、call the message directly 。そうすれば、必要なメッセージに ".child()"が表示され、Firebase全体を照会するのではなく "間接的に" direct linkが作成されます。

あなたがそのようなメッセージを保存する必要があり、その目的のために

ロードあなたの配列にすべてのメッセージ:あなたはどちらか次にsaveMessages(userID: myUserID, messages: message)

で関数を呼び出す

//for my example I've created a struct: Message 
struct Message { 
    var message: String = "" 
    var user: String = "" 
    var messageID: String = "" 
} 

func saveMessages(userID: String, message: Message) { // or your dictionary 

    // here you set an auto id 
    let reference = firebase.child(userID).childByAutoId() 

    // here you save the id into your messages dict/model 
    message.messageID = reference.key 

    // here you save the dict/model into your firebase 
    reference.setValue(message) { (error, ref) -> Void in 
     if error != nil { 
      print("\(error)") 
     } 
    }   
} 

構造体:

// we create and instantiate an Array of Message 
var messages: [Message] = [] 

func loadAllMessages(userID: String) { 

    //we query all messages from the certain user 
    let usersRef = firebase.child(userID).child("messages") 
    usersRef.observeEventType(.Value, withBlock: { snapshot in 

     if snapshot.exists() { 

      // since we use observeEventType we need to clear our Array 
      // everytime our snapshot exists so we're not downloading 
      // single messages multiple times 
      self.messages.removeAll() 

      // I'm always sorting for date 
      // even if your dict has no date, it doesnt crash 
      let sorted = (snapshot.value!.allValues as NSArray).sortedArrayUsingDescriptors([NSSortDescriptor(key: "date",ascending: false)]) 

      // now we loop through sorted to get every single message 
      for element in sorted { 

       let message = element.valueForKey("message")! as? String 
       let name = element.valueForKey("name")! as? String 
       let messageID = element.valueForKey("messageID")! as? String 
       // we're creating a message model 
       let m = Message(message: message!, name: name!, messageID: messageID!) 
       // and saving it into our array 
       self.messages.append(m)      
      } 
     }    
    }) 
} 

または、すでに知っているIDでのメッセージ。

func loadSingleMessages(userID: String, messageID: String) { 

    // we use the direct "link" to our message 
    let usersRef = firebase.child(userID).child(messageID) 
    usersRef.observeEventType(.Value, withBlock: { snapshot in 

     if snapshot.exists() { 

      let message = snapshot.valueForKey("message")! as? String 
      let name = snapshot.valueForKey("name")! as? String 
      let messageID = snapshot.valueForKey("messageID")! as? String   
      // create the model   
      let m = Message(message: message!, name: name!, messageID: messageID!) 
      // and save it to our Array  
      self.messages.append(m)      
     }    
    }) 
} 

概要:全体Firebaseを通じて照会するとループに希望のメッセージにあなたの方法を持ってすることなく、直接、あなたのメッセージを呼び出すことができるように、あなたはそれを保存し、生成されたautoIDを知っておく必要がありますし、そのIDを持つ参照を照会します。

たとえば、メッセージIDだけを格納しているFirebaseでユーザの中に配列を設定することができます。そしてそれらを使ってあなたが望むメッセージを問い合わせることができます。あなたは、あなたは、ダウンロードしてFirebaseから自分のUserモデルをインスタンス化した後

struct User { 
    var userID: String = "" 
    var name: String = "" 
    var email: String = "" 
    var profileImageURL = "" 
    var messages: [String] = [] 
} 

let user = User() 

:このような

何か

// for every message in our user.messages we call our function 
for message in user.messages { 
    loadSingleMessages(userID: user.userID, messageID: message) 
} 

をところで、メッセージIDができるようにすることも重要です特定のメッセージを削除または編集します。

+0

この詳細な回答をいただきありがとうございます。私は今日これを試し、あなたに報告します! –

+0

あなたは大歓迎です。ハッピーコーディング –

関連する問題