【问题标题】:Cloud Firestore Reading an ArrayCloud Firestore 读取数组
【发布时间】:2020-01-05 00:42:34
【问题描述】:

我有一组警报(如您将在下面看到的警报类型),我正在尝试从 Cloud Firestore 存储和读取这些警报。我可以上传警报数组,但无法读取/解码它。当我使用下面的代码时,它会崩溃,因为我尝试解码带有错误的 alarmArray:

致命错误:“试试!”表达式意外引发错误:Swift.DecodingError.typeMismatch(Swift.Dictionary, Swift.DecodingError.Context(codingPath: [], debugDescription: "Not a dictionary", underlyingError: nil))

保存数据功能:

static func saveData(alarmArray: [Alarm]) {
        let db = Firestore.firestore()
        let firebaseAlarms = try! FirebaseEncoder().encode(alarmArray)

        db.collection(K.FStore.alarmCollection).addDocument(data: [
            K.FStore.userAlarms : firebaseAlarms
        ]) { (error) in
            if let e = error {
                print("Error saving: \(e)")
            } else {
                print("Successfully Saved")
            }
        }
    }

加载数据函数:

    static func loadData() -> [Alarm] {

            let db = Firestore.firestore()
            var alarmArray: [Alarm] = []

            db.collection(K.FStore.alarmCollection).getDocuments { (querySnapshot, error) in    
                if let e = error {
                    print("error retrieving from Firestore, \(e)")
                } else {
                    if let snapshotDocuments = querySnapshot?.documents {
                        for firebaseAlarms in snapshotDocuments {
                            alarmArray = try! FirebaseDecoder().decode(Alarm.self, from: firebaseAlarms) //the app crashes here!
                        }
                    }
                }

            }
        return alarmArray
    }

报警型号:

struct Alarm: Codable {
    var uuid: String
    var time: Time
    var label: String
    var repeatStatus: [DetailInfo.DaysOfWeek]
    var isOn: Bool
    var onSnooze: Bool
}

我正在使用 CodableFirebase pod 的文档 here 和 Firebase 的文档 here,但很难将它们组合在一起。

【问题讨论】:

    标签: arrays swift firebase google-cloud-firestore


    【解决方案1】:

    请将模型的 all 属性声明为可选。

    此外,属性名称应与 firebase 相同。

    如果您需要不同的名称,请使用编码键。

    在解码之前序列化您的 Firebase 数据。

    将您的解码线放在 do catch 块上。

    也不要使用 firebase 解码器使用 Swift 解码器来解码数据。

    guard let JSONData = try? JSONSerialization.data(withJSONObject: data, options: .prettyPrinted) else { return }
    
    guard let alarm = try? JSONDecoder().decode(Alarm.self, from: JSONData) else { return }
    

    如果错误再次显示,请使用手动映射。

    【讨论】:

      【解决方案2】:

      通过将 loadData() 函数更改为:

      static func loadData() -> [Alarm] {
      
      
          let db = Firestore.firestore()
          var alarmArray: [Alarm] = []
          db.collection(K.FStore.alarmCollection).getDocuments { (querySnapshot, error) in
      
              if let e = error {
                  print("error retrieving from Firestore, \(e)")
              } else {
                  if let snapshotDocuments = querySnapshot?.documents {
                      for doc in snapshotDocuments {
                          let data = doc.data()
                          if let alarm = data[K.FStore.userAlarms] {
                              alarmArray = try! FirebaseDecoder().decode([Alarm].self, from: alarm)
                              print(alarmArray)
                          }
                      }
                  }
              }
          }
          return alarmArray
      }
      

      【讨论】:

        猜你喜欢
        • 2018-10-26
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        • 2018-11-25
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多