Получить несколько дочерних веток Firebase Swift 4 в TableView - PullRequest
0 голосов
/ 08 мая 2019

Структура базы данных в реальном времени firebase выглядит следующим образом: enter image description here

Затем я намереваюсь показать значения для каждого из дочерних элементов в виде нескольких таблиц, как показано ниже

enter image description here

В моем табличном представлении я получаю только отдельные поля, а не массив данных, который я намереваюсь показать, то есть я получаю только значения 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")
        }
    }
}

1 Ответ

0 голосов
/ 08 мая 2019

потому что другие значения не являются строковыми

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) и self.tableView.reloadData ()

не будут выполнены.Эти данные, такие как:

"- LeMs5uFRP21y8KMOwPo": {...

- это не строка, а объект словаря.Поэтому вы должны проверить, является ли это String -> просто добавить как сейчас, но если нет, вы должны вызвать

DataSnapshot.childSnapshot (forPath: "Name"). Value как?Строка

(в вашем случае, конечно), чтобы получить значение детей.

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

}

как-то так

...