【问题标题】:Code only retrieving one value from data in Firebase代码仅从 Firebase 中的数据中检索一个值
【发布时间】:2018-02-18 02:13:20
【问题描述】:

正如标题所示,我正在尝试从 firebase 数据库中检索一些数据,但我的代码无法正常工作。我在“帖子”内有三个孩子(我猜你就是这么称呼他们的),分别称为“标题”、“描述”和“用户名”,我正在尝试获取所有这些孩子并将它们附加到一个变量中以供以后使用,但它只检索每个值的第一个值,尽管事实上有 5 个值。有谁知道为什么? 顺便说一句,我在 ViewDidLoad 上调用了这个函数。

let postDB = Database.database().reference().child("Posts")
postDB.queryOrderedByKey().observeSingleEvent(of: .value) { (snapshot) in
    if let snapshotValue = snapshot.value as? NSDictionary {

    let postTitle = snapshotValue["title"] as? String
    let postUsername = snapshotValue["username"] as? String
    let postDesc = snapshotValue["description"] as? String

    let postArray = postStruct(title: postTitle, description: postDesc, username: postUsername)
    self.newPost.insert(postArray, at: 0)

    }

【问题讨论】:

  • 子“帖子”中是否有多个帖子?
  • 是的,有。

标签: swift firebase firebase-realtime-database


【解决方案1】:
import UIKit
import FirebaseDatabase

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    // MARK: - variables
    var postDB: DatabaseReference!

    override func viewDidLoad() {
        super.viewDidLoad()

        // getting a node from database //
        postDB = Database.database().reference().child("Posts")

        // observing data changes //
        postDB.observe(DataEventType.value) { (dataSnapshot) in
            self.postArray.removeAll()
            if dataSnapshot.childrenCount > 0 {
                for post in dataSnapshot.children.allObjects as! [DataSnapshot] {
                    let object = post.value as! [String: Any]
                    let description = object["description"] as! String
                    let title = object["title"] as! String
                    let userName = object["username"] as! String
                    let model = postStruct(title: title, description: description, username: userName))
                    self.postArray.append(model)
                }
            }
            self.tableView.reloadData()
        }
    }
}

【讨论】:

    【解决方案2】:

    试试这个 - 代码替换您当前在快照处理程序中的内容。

    if let firebaseList = snapshot.children.allObjects as? [FIRDataSnapshot] {
            if let swiftList = snapshot.value as? [String:AnyObject] {
                for firebaseItem in firebaseList {
                    let childID = firebaseItem.key as String
                    let swiftItem = swiftList[childID]
                    let postTitle = swiftItem?["title"] as? String
                    let postUsername = swiftItem?["username"] as? String
                    let postDesc = swiftItem?["description"] as? String
                    let postArray = postStruct(title: postTitle, description: postDesc, username: postUsername)
                    self.newPost.insert(postArray, at: 0)
                }
            }
        }
    }
    

    【讨论】:

    • 我确实有每个孩子的帖子数组,但我尝试了你的代码,它仍然不起作用。
    • 您能否提供您的 Firebase 数据库的屏幕截图并将其添加到您的原始帖子中?
    • 完成!还有什么我应该补充的吗?
    • @G.Bec - 查看我的答案的编辑,我认为这应该为您完成这项工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多