[英]Can't retrieve data from Firebase with Swift
我正在尝试创建一个视图控制器,以显示前一个视图控制器上的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
})
}
}
您的引用有误, childByAutoId()
用于在数据库中生成唯一的ID。
另外,当前拥有的ID是用户ID,您需要检索该用户ID:
let user = Auth.auth().currentUser
let uid = user.uid
那么位置应该是:
let ref = Database.database().reference().child("shops").child(uid).child("Eat").child("Details")
所以这里有几个问题,首先是您的数据结构。
遵循这些思路的内容将更容易阅读。 据我所知,您不需要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
})
}
我已修改为设置数据库参考值,否则,如果您尝试在其他地方使用它,则会崩溃。 我还添加了一些保护声明,以最大程度地减少显式展开的次数。
我无法评论您的列表代码,但是您是否考虑过对此中的所有商店进行呼叫,并将结果映射到数据对象,然后可以将其用于在我们正在详述的屏幕中显示数据在这里,而不是每次打开详细信息屏幕时都进行单独的查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.