【问题标题】:Cannot fetch / read data from firebase real-time database to UITableViewController无法从 firebase 实时数据库中获取/读取数据到 UITableViewController
【发布时间】:2019-04-27 03:44:10
【问题描述】:

我能够成功地将数据从我的应用程序写入我的 firebase 实时数据库。我无法检索数据并将其显示在 UIViewController 中。

我有搜索堆栈、YouTube 和 firebase 文档,但没有运气。我打印出计数并返回 0。我相信 For 循环没有迭代或它没有正确附加到我的数组。我已经尝试强制包装和展开 refRepairs,并从中放置 databaseHandle。

    override func viewDidLoad() {
    super.viewDidLoad()
    refRepairs = Database.database().reference().child("repairs");

    //observing the data changes
    refRepairs!.child("repairs").observe(DataEventType.value, with: { (snapshot) in

        //if the reference have some values
        if snapshot.childrenCount > 0 {

            //clearing the list
            self.repairList.removeAll()

            //iterating through all the values
            for repairs in snapshot.children.allObjects as! [DataSnapshot] {
                //getting values
                let repairObject = repairs.value as? [String: AnyObject]
                let brand  = repairObject?["brand"]
                let id  = repairObject?["id"]
                let modelNumber = repairObject?["modelNumber"]

                //creating artist object with model and fetched values
                let repair = RepairModel(id: id as! String?, brand: brand as! String?, modelNumber: modelNumber as! String?)

                //appending it to list
                print(snapshot.childrenCount)

                self.repairList.append(repair)
            }

            //reloading the tableview
            self.doListTableView.reloadData()
        }
    })
}

我进行了更改,它正在工作!!!现在,我正在尝试通过uid将记录添加到数据库中,并且我已经成功完成了。现在我有同样的问题,我无法显示记录。我打印了计数,它返回了 1 条正确的记录。这是新代码。

    override func viewDidLoad() {
    super.viewDidLoad()
    refRepairs = Database.database().reference().child("repairs");

    //observing the data changes
    //refRepairs!.child("uid").observe(DataEventType.value, with: { (snapshot) in


        //observing the data changes
        refRepairs!.observe(DataEventType.value, with: { (snapshot) in
        //if the reference have some values
        if snapshot.childrenCount > 0 {

            //clearing the list
            self.repairList.removeAll()

            //iterating through all the values
            for repairs in snapshot.children.allObjects as! [DataSnapshot] {
                //getting values
                let repairObject = repairs.value as? [String: AnyObject]
                let brand  = repairObject?["brand"]
                let uid = repairObject?["uid"]
                let id  = repairObject?["id"]
                let modelNumber = repairObject?["modelNumber"]

                //creating artist object with model and fetched values
                let repair = RepairModel(uid: uid as! String?, id: id as! String?, brand: brand as! String?, modelNumber: modelNumber as! String?)

                //appending it to list
                print(snapshot.childrenCount)

                self.repairList.append(repair)
            }

            //reloading the tableview
            self.doListTableView.reloadData()
        }
    })
}

【问题讨论】:

  • 另外,我已经仔细检查以确保我的 IBOutlets、委托和数据源已从情节提要连接到控制器。

标签: swift xcode firebase-realtime-database fetch


【解决方案1】:

当您“观察数据更改”时,您正在寻找另一个称为修复的第二个孩子。试试这个:

override func viewDidLoad() {
  super.viewDidLoad()
  refRepairs = Database.database().reference().child("repairs");

  //observing the data changes
  refRepairs!.observe(DataEventType.value, with: { (snapshot) in

    ...

如果这不起作用。使用 Firebase 中的 observeSingleEvent 方法

【讨论】:

  • 使用上面的代码,我可以添加一个字段来按用户 ID 显示单元格吗?我不希望每个人都看到每个人都添加了什么,只是他们添加了什么......
  • 是的。您的孩子需要包含带有 UserID 的引用。因此,当您获取该孩子时,仅按 UserID 过滤该获取
  • 太棒了!我更改了代码并通过 userID 成功地将记录添加到数据库中。如何调整上面的代码只显示 uid?
猜你喜欢
  • 2020-02-27
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多