Как использовать базу данных Firebase для отображения нескольких маршрутов / дочерних объектов в табличном представлении с использованием Xcode / Swift - PullRequest
2 голосов
/ 08 марта 2019

Вот моя база данных Firebase:

enter image description here

А вот мой код:

class AdminSearchViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    var ref: DatabaseReference!
    var jobList = [jobModel2]()

    @IBOutlet weak var tlb2: UITableView!

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as! ViewController2TableViewCell
        let job: jobModel2
        job = jobList[indexPath.row]
        cell.ship.text = job.consignee
        cell.reference.text = job.reference
        return cell
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return jobList.count
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        if FirebaseApp.app() == nil {
            FirebaseApp.configure()
        }
        Database.database().reference().child("jobs").observe(DataEventType.value) { (snapshot) in
            if snapshot.childrenCount>0 {
                self.jobList.removeAll()
                for jobs in snapshot.children.allObjects as! [DataSnapshot]{
                    let jobObject = jobs.value as? [String: AnyObject]
                    let jobConsignee = jobObject?["consignee"]
                    let jobReference = jobObject?["reference"]
                    let job = jobModel2( consignee: jobConsignee as! String?,
                                         reference: jobReference as! String?
                    )
                    self.jobList.append(job)
                }
                self.tlb2.reloadData()
            }
        }
    } 
}

Проблема, с которой я сталкиваюсь,что в моем TableView ничего не происходит, я думаю, что это связано с .childs, так как я думаю, что мне нужно сменить его с «рабочих мест» на что-то, но я не могу этого понять.

Я хочу отобразить список всех ссылок со всех UID, а не только один.

КОД, КОТОРЫЙ ПОКАЗЫВАЕТСЯ В ПЕЧАТИ:

func readJobs() {


    let ref = Database.database().reference()

   let ref1 = ref.child("jobs").queryOrderedByKey()


        ref1.observeSingleEvent(of: .value, with: { snapshot in
            let allUsersAndJobs = snapshot.children.allObjects as! [DataSnapshot]
            for user in allUsersAndJobs {
                let uid = user.key
                print("user id: \(uid)")
                let thisUsersJobs = user.children.allObjects as! [DataSnapshot]
                for job in thisUsersJobs {
                    let jobKey = job.key
                    let consignee = job.childSnapshot(forPath: "consignee").value as! String
                    print(" job #: \(jobKey)")
                    print("   consignee: \(consignee)")
                }
            }
        })
    }

1 Ответ

0 голосов
/ 08 марта 2019

Так что это не сработает - структура firebase не соответствует тому, что вы пытаетесь прочитать.

Ваша структура

jobs
   uid_0
      job_key_0
          ...
      job_key_1
          ...
   uid_1
      job_key_0
          ...

и вы читаете узел заданий, который содержит прямые дочерние элементы, но вы не читаете дочерние дочерние элементы.

uid_0
uid_1
etc

Таким образом, структура Firebase глубже, чем то, что вы читаете, поэтому вам нужно прочитать код на один уровень ниже, чтобы добраться до дочерних узлов задания.

Если предположить, что 5hs ... и 7py ... это код пользователя, то здесь код для чтения каждого узла, печати пользовательского идентификатора и затем их заданий

func readJobs() {
    let ref = self.ref.child("jobs")
    ref.observeSingleEvent(of: .value, with: { snapshot in
        let allUsersAndJobs = snapshot.children.allObjects as! [DataSnapshot]
        for user in allUsersAndJobs {
            let uid = user.key
            print("user id: \(uid)")
            let thisUsersJobs = user.children.allObjects as! [DataSnapshot]
            for job in thisUsersJobs {
                let jobKey = job.key
                let consignee = job.childSnapshot(forPath: "consignee").value as! String
                print(" job #: \(jobKey)")
                print("   consignee: \(consignee)")
            }
        }
    })
}

и вывод

user id: 5HS
 job #: job_0
   consignee: Anni
 job #: job_1
   consignee: Ralph
user id: 7py
 job #: job_0
   consignee: Larry
 job #: job_1
   consignee: Bill
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...