我正在尝试创建一个视图控制器,从前一个视图控制器上的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
})
}
}
答案 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
字段,是否需要嵌套详细信息?
接下来,您可以重构数据参考代码。我首先建议将逻辑提取到自己的方法中,而不是直接在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的数量。
我无法对您的列表代码发表评论,但您是否考虑过对此中的所有商店进行调用,并将结果映射到数据对象,然后您可以使用该数据对象在屏幕上显示数据在这里详细说明,而不是每次打开详细信息屏幕时都进行单独的查询。