2017-08-11 9 views
-1

firebase(データベース)からデータを取得しようとしましたが、幸いにも幸運にも悲しいことです:これは正しい方法ですか?スウィフトはFirebaseからデータを取得します

let dBRef = Database.database().reference() 
     dBRef.child("Users").child("Advertisements").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in 

    let snapshotValue = snapshot.value as? NSDictionary 

     let imageAd = snapshotValue?["imageAd"] as? String 
     let priceAd = snapshotValue?["priceAd"] as? String 

イム私は実際にデータを受け取るかどうかわからない、とイムないだけでなく、これをテストする方法の確認...私はデバッグを試みたが、運としている... だから私の質問は、私ですコードが間違って行われましたか?もしそうでなければ、私は実際にデータを受け取ったかどうかチェックするのですか?

enter image description here

答えて

1

あなたはchildAddedイベントを監視しています。

新しい値を挿入した場合にのみ閉鎖が実行されます。Users/Advertisementsです。

ではなく

Database 
    .database() 
    .reference() 
    .child("Users") 
    .child(Auth.auth().currentUser!.uid) 
    .child("Advertisements") 
    .queryOrderedByKey() 
    .observeSingleEvent(of: .value, with: { snapshot in 

     guard let dict = snapshot.value as? [String:Any] else { 
      print("Error") 
      return 
     } 
     let imageAd = dict["imageAd"] as? String 
     let priceAd = dict["priceAd"] as? String 
    }) 

閉鎖は一度だけ実行されます。このコードを試してみて、「ほとんど」すぐ。

+0

だから私はこのようにする必要はありませんか? dBRef.child( "Users /(Auth.auth()。currentUser!.uid)/ advert isements") このように、uidの部分が欠落しているというエラーはありませんか? – StrawHat

+0

@StrawHatはい、userIDも追加する必要があります。私の更新された答えを見てください。 –

+0

乾杯ですが、データベースから現在の利用可能なデータを検索する方法をテストして確認する方法はありますか?私は本当にこれをテストする方法がない?あなたが見ているのであまりよく知られていないウィット.. – StrawHat

0

私は一つの問題を見ることができますが、あなたのパスが間違っているということです。

let dBRef = Database.database().reference()  
dBRef.child("Users/\(FirAuth.auth.currentUser.uid)/advertisements") 

dbRef.queryOrderedByKey().observe(.childAdded, with: { (snapshot) in 
+0

私はそれが座っている方法が間違っている理由を詳しく教えていただけますか?ありがとう FirAuth.auth.currentUser.uidが間違っていますか? – StrawHat

+0

確かに、私が言っていたことは、あなたのデータベース参照では "users/advertisement /"をやっているが、refは "users/userid/advertisements"でなければならないということだった。ユーザーID –

+0

ああそうだね。 dBRef.child( "ユーザー/ \(Auth.auth()。現在のユーザー.uid)/広告") ..私はそれを変更しましたが、何も起こらないようです。実際にデータを受信しますか?変数をデバッグするか、別のものを試すか? – StrawHat

1

データを正確に取得したかどうかをテストするには、コードの下にprint(imageAd)を追加します。このコードがviewDidLoadであると仮定すると、View Controllerが起動するとコンソールに表示されます。

も、私は.queryOrderedByKey(...).observe()は、本質的にあなたのfirebaseへの接続を開くことを覚えておいて、今.queryOrdered(byKey:...)

であると考えています。リアルタイムのリアルタイムの接続を開いたままにして、データの更新を待機させたい場合は、これが理にかなっています。データを1回だけ読み込む必要がある場合は、代わりに.observeSingleEventOf()を使用することを検討してください。 .observe()を使用する場合は、接続を閉じるときに接続を閉じるには、.removeAllObservers()も使用する必要があります。

これは、以前にDBに設定したこの情報を追加しようとしているようです。私はこのようにしています - (あなたのjsonでuidステップがないことを覚えておいてください。私はそれが下のコードでは現在のユーザーだと仮定しましたが、静的なユーザーの場合は文字列):

let uid = Auth.auth().currentUser?.uid 
dBRef.child(Users).child(uid).child(Advertisements).observeSingleEvent(of: 
    .value, with: { (snapshot) in 

    let value = snapshot.value as? NSDictionary 
    let imageAd = value?["imageAd"] as? String ?? "" 
    let priceAd = value?["priceAd"] as? String ?? "" 

    print("imageAd: \(imageAd!)") 
    print("priceAd: \priceAd!)")` 
    }) 
+0

私の見て、tableViewにデータのセットをリストすることです、なぜ私はobserSingeEventを使用していないthats ...またはあなたは実際に存在するかどうかを確認するためにこれを提案フェッチされた? – StrawHat

+0

これは最初に、printステートメントを通してデータがフェッチされていることを示します。あなたはテーブルビューで提示しようとしていることを明確にすることはできますか? – matador0227

+0

単一のイベントを使用して、テーブルビューにそのイベントを設定することができます。違いは、たとえば、現在のユーザーが探しているときにデータを入力していて、リアルタイムでデータを更新する必要がある他のユーザーがいる場合です。観察は外に立って起こることを見ることに似ています。単一のイベントが外に出て、その瞬間にそこにあるすべてのものを撮影しています。後でデータを使って行うことは、それとは独立しています。 – matador0227

0

私はあなたと同じ問題を抱えていましたが、Firebase Docを見れば簡単にデータを取得できます。

lazy var databaseRef = Database.database().reference().child(yourpath).("Advertisements") 

ref.observeSingleEvent(of: .value, with: { (snapshot) in 

      let postDict = snapshot.value as? [String : AnyObject] ?? [:] 

      if let email = postDict["Email"] { 
       print(email) 

      } 



     }) { (error) in 
      print(error.localizedDescription) 
     } 
関連する問題