2017-08-11 206 views
-1
檢索數據

我試圖從檢索火力(數據庫)數據的不同嘗試,但遺憾的是,沒有運氣:我......所以我想知道如果這是這樣做的正確方法是什麼?斯威夫特從火力地堡

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)/ adverteements」) 所以錯誤不是由於缺少uid部分? – StrawHat

+0

@StrawHat是的,您還需要添加用戶標識。請看我更新的答案。 –

+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

當然,我的意思說的是,在你的數據庫引用你正在做「用戶/廣告/」,但您的文獻應該是「用戶/用戶名/廣告」你跳過userid –

+0

Arh所以它應該是這樣的; dBRef.child(「用戶/ \(Auth.auth()。currentUser!.uid)/廣告」) ..我只是改變了它,但好像什麼也沒有發生,是有,如果我我測試的方式實際接收數據?調試一個變量或嘗試其他的東西? – StrawHat

1

測試,如果你的數據是在準確的拉,你可以添加以下代碼:print(imageAd)。假設這個代碼在viewDidLoad中,那麼當視圖控制器出現時它將顯示在控制檯中。

還,我相信.queryOrderedByKey(...)現在.queryOrdered(byKey:...)

記住.observe()基本上打開你的火力點的連接。如果你想要一個實時的,實時的連接來保持開放並且監聽數據的更新,這是有道理的。如果您只需要一次數據,當您加載某些內容時,請考慮使用.observeSingleEventOf()。如果您打算使用.observe(),則當您需要關閉連接時,還應使用.removeAllObservers()關閉連接。

好像你只是想添加這個信息,你之前設置在你的數據庫。我會這樣做 - (請記住,你錯過了你的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 ...或者你建議這只是爲了看看是否真的存在牽強? – StrawHat

+0

這將最初顯示您正在通過打印語句獲取數據。你能否澄清你想要在表格視圖中呈現的內容? – matador0227

+0

您可以使用單個事件並使用該事件填充表格視圖。例如,如果您有其他用戶在當前用戶正在查看時正在輸入數據,並且您想要實時更新數據,則會有所不同。觀察類似於站在外面觀察事情發生。單一事件正在外面並拍攝當時所有事物的照片。你以後對數據做的是獨立於此的。 – matador0227

0

我有同樣的問題,因爲你的,但通過看火力文件,你可以看到如何輕鬆地檢索數據。

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) 
     } 
相關問題