2017-06-03 28 views
0

我是一名快速入門者,我想從firebase數據庫中獲取價值,但它總是會重複使用兩次相同的字典結構,並且無法將值放入tableview單元格中當我展開墜毀...如何讀取firebase數據庫並將其放入tableview單元格中問題

這裏是我的JSON格式

enter image description here

代碼工作

import UIKit 
import Firebase 
//import FirebaseAuthUI 
//import FirebaseGoogleAuthUI 
//import FirebaseFacebookAuthUI 

let device = FIRDatabase.database().reference() 

class MainTableViewController: UITableViewController 
{ 
    var dic:NSDictionary? 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     //獲取當前登陸用戶 
     FIRAuth.auth()?.addStateDidChangeListener(self.UserAlive(auth:user:)) 
     print("主畫面viewDidLoad") 
    } 

    func UserAlive(auth: FIRAuth, user: FIRUser?) 
    { 
     if user == nil 
     { 

      self.present((self.storyboard?.instantiateViewController(withIdentifier: "SignIn"))!, animated: true, completion: nil) 
     } 
     else 
     { 
      csGolbal.g_User = user 
      CheckData() 
     } 
    } 

    func CheckData() 
    { 
     print("CHECKDATA")   
     let ref = device.child("USER").child(csGolbal.g_User!.email!.replacingOccurrences(of: ".", with: "_")) 

     ref.observeSingleEvent(of: .value, with: 
      { (snapshot) in 
       if snapshot.exists() 
       { 
        csGolbal.g_key = ((snapshot.value as AnyObject).allKeys)! 
       } 
       ref.child(csGolbal.g_key![0] as! String).observeSingleEvent(of: .value, with: 
        { (snapshot) in 
         // Get user value 
         self.dic = snapshot.value as? NSDictionary 
         print(self.dic) 
         //self.tableView.reloadData() 
       }) 
     }) 

    } 

,這裏是我不明白如何把在

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 

     if let number = csGolbal.g_key?.count 
     { 
      return number 
     } 
     else 
     { 
      return 0 
     } 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "MainTableViewCell", for: indexPath) as! MainTableViewCell 

     //put in here 
     // label.text and ImageView 

     return cell 
    } 

請HLEP我,並告訴我在哪裏,我做錯了。

@dahiya_boy我試試你的功能

func getDataFromDB() 
    { 
     DispatchQueue.main.async(execute: { 

      //let dbstrPath : String! = "Firebase Db path" 
      let ref = device.child("USER").child(csGolbal.g_User!.email!.replacingOccurrences(of: ".", with: "_")) 

      ref.observeSingleEvent(of: .value, with: { (snapshot) in 
       if !snapshot.exists() 
       { 
        print("snapshot not exists") 
       } 
       else 
       { 

        for item in snapshot.children 
        { 
         let number = item as! FIRDataSnapshot 
         var aDictLocal : [String : String] = number.value! as! [String : String] 
         aDictLocal.updateValue(number.key, forKey: "key") 

         print("value \(number.value!) And Key \(number.key)") // Here you got data 
        } 
       } 
       self.tableView.reloadData() 
      }) 
     }) 

    } 

,並將結果反饋兩次

enter image description here

回答

0

其實已存儲的數據在數據庫中隨機密鑰,以便使用下面FUNC

func getDataFromDB(){ 
     DispatchQueue.main.async(execute: { 

      let dbstrPath : String! = "Firebase Db path)" 

      dbRef.child(dbstrPath!).observeSingleEvent(of: .value, with: { (snapshot) in 
       if !snapshot.exists(){ 

        print("snapshot not exists") 

       } 
       else{ 
        self.arrEmail.removeAll() // Add this 
        for item in snapshot.children { 
         let number = item as! FIRDataSnapshot 
         var aDictLocal : [String : String] = number.value! as! [String : String] 
         aDictLocal.updateValue(number.key, forKey: "key") 
         self.arrEmail.append(aDictLocal) // add this 
         print("value \(number.value!) And Key \(number.key)") // Here you got data 
        } 
       } 
       // self.tblContacts.reloadData() 
      }) 
     }) 

    } 

編輯

在VC創建類似下面一個全局數組

var arrEmail = [[String : String]]() // Assuming your key and value all string 

在上面的代碼工作添加兩行(我編輯和評論添加此

self.arrEmail.removeAll() 

and

self.arrEmail.append(aDictLocal) // Now in arrEmail you have all the values for every random key. 
+0

CheckData由getDataFromDB()取代? – benjamin

+0

@benjamin是啊!使用這個func –

+0

它會查詢兩次並反饋兩次值...,並且我應該在observeSingleEvent數據之前搜索此用戶的電子郵件以瞭解隨機密鑰嗎? – benjamin

相關問題