在 TableView 中检索多个 Child 分支 Firebase Swift 4
Retrieve Multiple Child branches Firebase Swift 4 in TableView
firebase的real-time数据库结构如下:
然后,我打算在多个 table 视图中显示每个 children 的值,如下所示
在我的 table 视图中,我只收到单个字段而不是我打算显示的数据数组,也就是说,我只收到 ShowDataOne 的值和不是我 JSON
中显示的其他字段
{ "CrudPrincipal" : {
"-LeCyGwSM-Ozsf8MmADa" : {
"Clasification" : "fsdfsdf",
"Name" : "fsdfsdf",
"Uses" : "fdsfsd"
},
"-LeDVuUxNKM-IzqmWb3s" : {
"Clasification" : "fdsfnj",
"Name" : "hOdw",
"Uses" : "fjdjf"
},
"-LeMqN4MfJYl1_ef-Umy" : {
"Clasification" : "Vázquez",
"Name" : "Daniel",
"Uses" : "fdjnfjd"
},
"-LeMrCIEvwRrz8YWwbnS" : {
"Clasification" : "erf3",
"Name" : "frf3q",
"Uses" : "rf3"
},
"-LeMs5uFRP21y8KMOwPo" : {
"Clasification" : "fases",
"Name" : "dadas",
"Uses" : "gfdgdfoigj"
},
"ShowDataOne" : "Hello World, first Data!"
},
我的数据模型代码如下:
import UIKit
import Foundation
import Firebase
import FirebaseDatabase
class oneCrudClass: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var nameFieldOne: UITextField!
@IBOutlet weak var clasificationFieldOne: UITextField!
@IBOutlet weak var usesFieldOne: UITextField!
@IBOutlet weak var tableView: UITableView!
var ref: DatabaseReference!
var postDataRef = [String]()
var databaseHandle: DatabaseHandle?
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
// Set firebase reference
ref = Database.database().reference()
// Retrieve the data and listen for changes
databaseHandle = ref.child("CrudPrincipal").observe(.childAdded, with: { (DataSnapshot) in
let crudOne = DataSnapshot.value as? String
if let actualInfo = crudOne {
self.postDataRef.append(actualInfo)
self.tableView.reloadData()
}
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return postDataRef.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:UITableViewCell=UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "PostCell")
cell.textLabel?.text = postDataRef[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCell.EditingStyle.delete {
postDataRef.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
}
}
@IBAction func posData(_ sender: Any) {
ref = Database.database().reference()
if nameFieldOne.text != "" && clasificationFieldOne.text != "" && usesFieldOne.text != "" {
self.ref?.child("CrudPrincipal").childByAutoId().setValue(["Name": nameFieldOne.text, "Clasification": clasificationFieldOne.text, "Uses": usesFieldOne.text])
nameFieldOne.text = ""
clasificationFieldOne.text = ""
usesFieldOne.text = ""
} else {
print("Missing fields")
}
}
}
因为其他值不是String
let crudOne = DataSnapshot.value as? String
if let actualInfo = crudOne {
self.postDataRef.append(actualInfo)
self.tableView.reloadData()
}
改变这个以便能够解析字典:
"-LeMs5uFRP21y8KMOwPo" : {
"Clasification" : "fases",
"Name" : "dadas",
"Uses" : "gfdgdfoigj"
}
+++补充:
在接收方,您有 DataSnapshot,它可以包含任何数据类型,并且您正在使用 DataSnapshot.value 作为?字符串假设此值将是一个字符串。如果没有,
self.postDataRef.append(actualInfo) and self.tableView.reloadData()
不会执行。
此数据如:
"-LeMs5uFRP21y8KMOwPo" : {...
不是字符串,而是字典Object。所以你必须检查它是否是一个字符串 - >就像现在一样添加,但如果不是你必须调用
DataSnapshot.childSnapshot(forPath: "Name").value as? String
(当然是你的情况)得到 children 值。
let crudOne = DataSnapshot.value as? String
if let actualInfo = crudOne {
self.postDataRef.append(actualInfo)
self.tableView.reloadData()
} else if let actualInfo = DataSnapshot.childSnapshot(forPath: "Name").value as? String {
self.postDataRef.append(actualInfo)
self.tableView.reloadData()
}
像这样
firebase的real-time数据库结构如下:
然后,我打算在多个 table 视图中显示每个 children 的值,如下所示
在我的 table 视图中,我只收到单个字段而不是我打算显示的数据数组,也就是说,我只收到 ShowDataOne 的值和不是我 JSON
中显示的其他字段 { "CrudPrincipal" : {
"-LeCyGwSM-Ozsf8MmADa" : {
"Clasification" : "fsdfsdf",
"Name" : "fsdfsdf",
"Uses" : "fdsfsd"
},
"-LeDVuUxNKM-IzqmWb3s" : {
"Clasification" : "fdsfnj",
"Name" : "hOdw",
"Uses" : "fjdjf"
},
"-LeMqN4MfJYl1_ef-Umy" : {
"Clasification" : "Vázquez",
"Name" : "Daniel",
"Uses" : "fdjnfjd"
},
"-LeMrCIEvwRrz8YWwbnS" : {
"Clasification" : "erf3",
"Name" : "frf3q",
"Uses" : "rf3"
},
"-LeMs5uFRP21y8KMOwPo" : {
"Clasification" : "fases",
"Name" : "dadas",
"Uses" : "gfdgdfoigj"
},
"ShowDataOne" : "Hello World, first Data!"
},
我的数据模型代码如下:
import UIKit
import Foundation
import Firebase
import FirebaseDatabase
class oneCrudClass: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var nameFieldOne: UITextField!
@IBOutlet weak var clasificationFieldOne: UITextField!
@IBOutlet weak var usesFieldOne: UITextField!
@IBOutlet weak var tableView: UITableView!
var ref: DatabaseReference!
var postDataRef = [String]()
var databaseHandle: DatabaseHandle?
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
// Set firebase reference
ref = Database.database().reference()
// Retrieve the data and listen for changes
databaseHandle = ref.child("CrudPrincipal").observe(.childAdded, with: { (DataSnapshot) in
let crudOne = DataSnapshot.value as? String
if let actualInfo = crudOne {
self.postDataRef.append(actualInfo)
self.tableView.reloadData()
}
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return postDataRef.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:UITableViewCell=UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "PostCell")
cell.textLabel?.text = postDataRef[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCell.EditingStyle.delete {
postDataRef.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
}
}
@IBAction func posData(_ sender: Any) {
ref = Database.database().reference()
if nameFieldOne.text != "" && clasificationFieldOne.text != "" && usesFieldOne.text != "" {
self.ref?.child("CrudPrincipal").childByAutoId().setValue(["Name": nameFieldOne.text, "Clasification": clasificationFieldOne.text, "Uses": usesFieldOne.text])
nameFieldOne.text = ""
clasificationFieldOne.text = ""
usesFieldOne.text = ""
} else {
print("Missing fields")
}
}
}
因为其他值不是String
let crudOne = DataSnapshot.value as? String
if let actualInfo = crudOne {
self.postDataRef.append(actualInfo)
self.tableView.reloadData()
}
改变这个以便能够解析字典:
"-LeMs5uFRP21y8KMOwPo" : {
"Clasification" : "fases",
"Name" : "dadas",
"Uses" : "gfdgdfoigj"
}
+++补充: 在接收方,您有 DataSnapshot,它可以包含任何数据类型,并且您正在使用 DataSnapshot.value 作为?字符串假设此值将是一个字符串。如果没有,
self.postDataRef.append(actualInfo) and self.tableView.reloadData()
不会执行。 此数据如:
"-LeMs5uFRP21y8KMOwPo" : {...
不是字符串,而是字典Object。所以你必须检查它是否是一个字符串 - >就像现在一样添加,但如果不是你必须调用
DataSnapshot.childSnapshot(forPath: "Name").value as? String
(当然是你的情况)得到 children 值。
let crudOne = DataSnapshot.value as? String
if let actualInfo = crudOne {
self.postDataRef.append(actualInfo)
self.tableView.reloadData()
} else if let actualInfo = DataSnapshot.childSnapshot(forPath: "Name").value as? String {
self.postDataRef.append(actualInfo)
self.tableView.reloadData()
}
像这样