【问题标题】:Can't retrieve data from Firebase with Swift无法使用 Swift 从 Firebase 检索数据
【发布时间】:2018-04-10 10:12:26
【问题描述】:

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

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            
        })
    }
}

【问题讨论】:

  • 店主创建了一个帐户并添加了创建此数据的数据
  • 还没有抱歉,我今晚会,我会回复评论
  • 是的,谢谢

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

您的引用是错误的,childByAutoId() 用于在您的数据库中生成唯一 id。

另外你当前拥有的id就是userid,你需要找回userid:

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

那么位置应该是:

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

【讨论】:

    【解决方案2】:

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

    这些内容会更容易阅读。据我所知,您不需要 name 字段,是否需要嵌套详细信息?

    读取数据

    接下来,您可以重构数据参考代码。我首先建议将逻辑提取到它自己的方法中,而不是直接在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            
        })
    }
    

    我已修改以设置数据库参考值,否则如果您尝试在其他地方使用它会崩溃。我还添加了几个保护语句来最小化显式展开的数量。

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

    【讨论】:

    • return nil 给出错误 'Unexpected non-void return value in void function'
    • 啊,对不起,我重用了我的旧代码,将return nil更改为return
    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多