【问题标题】:Reading Data from Firebase into Arrays将 Firebase 中的数据读入数组
【发布时间】:2019-02-08 19:44:43
【问题描述】:

从 firebase 读取快照相当简单,尽管将信息传输到数组更复杂。我有这张快照

Snap (01-08-2019) {
    Sleep = "6.25 hrs";
    "Time Uploaded" = "07:10 AM";
}
Snap (01-09-2019) {
    Sleep = "6.72 hrs";
    "Time Uploaded" = "07:19 AM";
}
Snap (01-10-2019) {
    Sleep = "6.55 hrs";
    "Time Uploaded" = "07:10 AM";
}

我怎样才能为日期、睡眠和上传时间创建一个数组。

【问题讨论】:

    标签: arrays swift database firebase


    【解决方案1】:

    我认为您应该重新考虑如何将数据存储在 Firebase 中。看起来与此类似。

    另外我会考虑为 day 创建一个看起来像这样的数据模型。

    class Day {
        var date: String
        var sleep: String
        var timeUploaded: String
    
        init(date: String, sleep: String, timeUploaded: String) {
            self.date = date
            self.sleep = sleep
            self.timeUploaded = timeUploaded
        }
    }
    

    然后你可以像这样获取你的快照。

    var days = [Day]()
    
    private func fetchDays() {
        print(days.count)
    
        let ref = Database.database().reference().child("days")
        ref.observeSingleEvent(of: .value) { (snapshot) in
            guard let days = snapshot.value as? [String: Any] else { return }
    
            for (_,value) in days.enumerated() {
                guard let dayDict = value.value as? [String: String] else { return }
                let date = dayDict["date"] ?? ""
                let sleep = dayDict["sleep"] ?? ""
                let timeUploaded = dayDict["time_uploaded"] ?? ""
    
                //If you really want 3 different arrays just add them here
                // dateArray.append(date) and so on for the other two arrays
                let day = Day(date: date, sleep: sleep, timeUploaded: timeUploaded)
                self.days.append(day)
            }
    
            print(self.days.count)
        }
    }
    }
    

    希望这会有所帮助。无法评论询问您的数据是如何构建的。

    【讨论】:

    • 这非常有效,谢谢。对于没有快速回复,我深表歉意。
    【解决方案2】:

    我建议不要将数据保存在不同的数组中,最好将来自每个节点的数据存储在一个类中,然后保留这些类的数组。

    让我们从一个保存所有数据的类开始

    class ChronoClass {
        var node_id = ""
        var sleep = ""
        var time_uploaded = ""
    
        init(withSnapshot: DataSnapshot) {
            let nodeId = withSnapshot.key
            let someSleep = withSnapshot.childSnapshot(forPath: "sleep").value as? String ?? ""
            let someTime = withSnapshot.childSnapshot(forPath: "time_uploaded").value as? String ?? ""
    
            self.node_id = nodeId
            self.sleep = someSleep
            self.time_uploaded = someTime
        }
    }
    

    然后是一个类数组来保存所有的类

    var sleepArray = [ChronoClass]()
    

    最后是读取每个节点的代码,填充类并将类存储在数组中。

    func readFirebaseDataAndPopulateArray() {
        let sleepNode = self.ref.child("sleep_node")
        sleepNode.observeSingleEvent(of: .value, with : { snapshot in
    
            for child in snapshot.children {
                let snap = child as! DataSnapshot
                let aChrono = ChronoClass(withSnapshot: snap)
                self.sleepArray.append(aChrono)
            }
    
            for x in self.sleepArray { //just prints out what's in the array
                print(x.node_id, x.sleep, x.time_uploaded)
            }
        })
     }
    

    以及基于您的结构的输出

    01-08-2019 6.25 hrs 07:10 AM
    01-09-2019 6.72 hrs 07:19 AM
    01-10-2019 6.55 hrs 07:10 AM
    

    使用类的好处是您可以对对象进行排序、搜索、推断或执行各种其他功能,而不是使用三个单独的数组。

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 2017-06-04
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      相关资源
      最近更新 更多