无法使用Swift从Firebase检索数据

时间:2018-04-10 10:12:27

标签: ios swift firebase firebase-realtime-database

我正在尝试创建一个视图控制器,从前一个视图控制器上的UITableView显示所点击商店的信息。但是,我无法在新的视图控制器中检索数据,我也不知道如何解决此问题。这是我的数据库结构。感谢您的帮助。 Database Structure

import UIKit
import Firebase
import FirebaseDatabase

class ShopViewController: UIViewController {    
    var name :String? // This is the name of the cell clicked on the previous viewcontroller

    var ref: DatabaseReference!
    @IBOutlet weak var shopName: UILabel!    
    @IBOutlet weak var shopType: UILabel!    
    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        shopName.text = name

        let ref = Database.database().reference().child("shops").childByAutoId().child(name!).child("Details")

        ref.observe(.childAdded, with: { snapshot in            
            let snapshotValue = snapshot.value as! NSDictionary
            let imageUrlString = snapshotValue["imageURL"] as! String
            print(imageUrlString)
            let shoptype = snapshotValue["type"] as! String
            self.shopType.text = shoptype            
        })
    }
}

2 个答案:

答案 0 :(得分:2)

您的参考文献有误,childByAutoId()用于在您的数据库中生成唯一ID。

您目前拥有的ID是userid,您需要检索用户ID:

let user = Auth.auth().currentUser
let uid = user.uid

然后该位置应为:

let ref = Database.database().reference().child("shops").child(uid).child("Eat").child("Details")

答案 1 :(得分:1)

所以这里有几个问题,首先是你的数据结构。

沿着这些方向的东西将更容易阅读。据我所知,您不应该需要name字段,是否需要嵌套详细信息?

enter image description here

读取数据

接下来,您可以重构数据参考代码。我首先建议将逻辑提取到自己的方法中,而不是直接在viewDidLoad

var ref: DatabaseReference!

override func viewDidLoad() {
    shopName.text = name
    self.ref = Database.database().reference()
    getShopDetails()
}

func getShopDetails() {
  guard let shopName = name else { return }
   ref.child("shops").child(shopName).observe(.childAdded, with: { snapshot in         
        guard let shop = snapshot.value as? [String: AnyObject] else { return }

        let imageUrlString = shop["imageURL"] as! String
        print(imageUrlString)
        let shoptype = shop["type"] as! String
        self.shopType.text = shoptype            
    })
}

我已修改为设置数据库引用值,否则如果您尝试在别处使用它会崩溃。我还添加了几个保护语句,以尽量减少显式unwraps的数量。

我无法对您的列表代码发表评论,但您是否考虑过对此中的所有商店进行调用,并将结果映射到数据对象,然后您可以使用该数据对象在屏幕上显示数据在这里详细说明,而不是每次打开详细信息屏幕时都进行单独的查询。