Firebase 将DataSnapshot转换为自定义结构对象-Swift 4
因此,在我的项目中,我创建了一个自定义结构:Firebase 将DataSnapshot转换为自定义结构对象-Swift 4,firebase,firebase-realtime-database,swift4,Firebase,Firebase Realtime Database,Swift4,因此,在我的项目中,我创建了一个自定义结构: import Foundation import Firebase struct CheckedIn { let ref: DatabaseReference? let key: String let max_cm: String let max_in: String let weight_kg: Int let weight_lb: Int init(key: String = "",
import Foundation
import Firebase
struct CheckedIn {
let ref: DatabaseReference?
let key: String
let max_cm: String
let max_in: String
let weight_kg: Int
let weight_lb: Int
init(key: String = "", max_cm: String, max_in: String, weight_kg: Int, weight_lb: Int) {
self.ref = nil
self.key = key
self.max_cm = max_cm
self.max_in = max_in
self.weight_kg = weight_kg
self.weight_lb = weight_lb
}
init?(snapshot: DataSnapshot) {
guard
let value = snapshot.value as? [String: AnyObject],
let max_cm = value["checked_max_cm"] as? String,
let max_in = value["checked_max_in"] as? String,
let weight_kg = value["checked_weight_kg"] as? Int,
let weight_lb = value["checked_weight_in"] as? Int
else {
return nil
}
self.ref = snapshot.ref as DatabaseReference
self.key = snapshot.key
self.max_cm = max_cm
self.max_in = max_in
self.weight_kg = weight_kg
self.weight_lb = weight_lb
}
func toAnyObject() -> Any {
return [
"checked_max_cm": self.max_cm,
"checked_max_in": self.max_in,
"checked_weight_kg": self.weight_kg,
"checked_weight_in": self.weight_lb
]
}
}
这是我的数据库的结构:
我尝试使用以下代码检索视图控制器中的一些数据:
ref.queryOrderedByKey().observe(.value) { (snapshot) in
var newItems: [CheckedIn] = []
for child in snapshot.children {
print(child)
if let snapshot = child as? DataSnapshot, let company = CheckedIn(snapshot: snapshot) {
newItems.append(company)
}
}
print(newItems)
self.companiesCheckedIn = newItems
self.tableView.reloadData()
UIViewController.removeSpinner(spinner: sv)
}
问题是,每当我尝试打开视图控制器时(这段代码在.viewDidLoad中),列表“newItems”都是空的。奇怪的是当我试着跑的时候
印刷品(儿童)
所有的数据都打印出来了
所以我假设'if let snapshot=child as?DataSnapshot,let company=CarryOn(snapshot:snapshot)'块未运行,我该怎么办?您的“已检查重量”和“已检查重量”是整数类型,但您指定了字符串类型
您的代码->
let weight_kg = value["checked_weight_kg"] as? String,
let weight_lb = value["checked_weight_in"] as? String
改变->
init?(snapshot: DataSnapshot) {
guard
let value = snapshot.value as? [String: AnyObject],
let max_cm = value["carry_max_cm"] as? String,
let max_in = value["carry_max_in"] as? String,
let weight_kg = value["checked_weight_kg"] as? Int,
let weight_lb = value["checked_weight_in"] as? Int
else {
return nil
}
self.ref = snapshot.ref as DatabaseReference
self.key = snapshot.key
self.max_cm = max_cm
self.max_in = max_in
self.weight_kg = weight_kg
self.weight_lb = weight_lb
}
通过解决方法解决了问题: 此代码位于ViewController的
viewDidLoad()
方法之前
let ref = Database.database().reference().child("alldata")
var companyName: [String] = []
var maxCm: [String] = []
var maxIn: [String] = []
var weightKg: [Int] = []
var weightLb: [Int] = []
在viewDidLoad()中
override func viewDidLoad(){
super.viewDidLoad()
中的ref.queryOrderedByKey().observeSingleEvent(of:.值){(快照)
让snapshotValue=snapshot.value为![String:[String:AnyObject]]
设sorted=snapshotValue.sorted(){$0.key.lowercased()<$1.key.lowercased()}
对于排序中的(键,x){
让关键点=快照值[关键点]
让公司名称=密钥
self.companyName.append(公司名称)
让我们将_max_cm=keys?[“keyname”]作为!字符串进行携带
self.maxCm.append(进位\u最大\u cm)
让\u max\u in=keys?[“keyname”]作为!字符串携带
self.maxIn.append(进位最大进位)
让我们携带重量=键?[“键名”]as!Int
自身重量kg.附加(携带重量kg)
让我们携带重量=键?[“键名”]as!Int
自身重量磅附加(携带重量磅)
}
self.tableView.reloadData()
}
}
let sorted=snapshotValue.sorted(){$0.key.lowercased()<$1.key.lowercased()}
按字母顺序排列词典我已尝试按照您的建议更改代码,但结果与以前相同。我已经更新了问题@Sabbir AhmedIt中的代码,问题是“无法将“String”类型的值赋值给“Int”类型。哦,已经可以了。您将类型String更改为Int,这样就不需要了。那么我现在要做什么?问题一直存在,当我敲你的时候,我正试图解决这个问题
override func viewDidLoad() {
super.viewDidLoad()
ref.queryOrderedByKey().observeSingleEvent(of: .value) { (snapshot) in
let snapshotValue = snapshot.value as! [String:[String:AnyObject]]
let sorted = snapshotValue.sorted() { $0.key.lowercased() < $1.key.lowercased() }
for (key, _) in sorted {
let keys = snapshotValue[key]
let company_name = key
self.companyName.append(company_name)
let carry_max_cm = keys?["keyname"] as! String
self.maxCm.append(carry_max_cm)
let carry_max_in = keys?["keyname"] as! String
self.maxIn.append(carry_max_in)
let carry_weight_kg = keys?["keyname"] as! Int
self.weightKg.append(carry_weight_kg)
let carry_weight_lb = keys?["keyname"] as! Int
self.weightLb.append(carry_weight_lb)
}
self.tableView.reloadData()
}
}