SwiftUI Firebase -分配默认值给Firebase时间戳数据类型



我在为Firebase时间戳数据类型分配默认值时遇到了麻烦

这是我的模型:

import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift
struct MiniSite: Codable, Identifiable {

@DocumentID var id: String?
var name:String
var city: String
var country: String
var region: String? = ""
@ServerTimestamp var createDate: Timestamp?   

}

我的Firebase数据是这样的:

name:"Clerigos Tower"
city :"Porto",
country:"Portrugal",
createDate: "March 3, 2021 at 4:19:53 PM UTC+2"(timestamp)

我读取Firebase数据的代码来自Peter Friese的视频"用SwiftUI和Firebase构建一个待办事项列表应用程序">

import Foundation
import Firebase
import FirebaseFirestore
import FirebaseFirestoreSwift
class MSiteRepository: ObservableObject {
let db = Firestore.firestore()


@Published var sites = [MiniSite] ()
func loadData() {
db.collection("sites")
.addSnapshotListener { (querySnapshot, error) in
if let querySnapshot = querySnapshot {
self.sites = querySnapshot.documents.compactMap { document in
do {
let x = try  document.data(as: MiniSite.self)
return x
}
catch {
print(error)
}
return nil
}
}
}
}
}

如果我的记录包含一个createDate,那么一切工作正常。但是createDate在我的数据库中是可选的,因此我在模型中相应地定义了它@ServerTimestamp var createDate: Timestamp?

如果Firebase中的文档不包含createDate字段,我在解码期间得到以下错误:

keyNotFound(CodingKeys(stringValue: "createDate", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: "createDate", intValue: nil) ("createDate").", underlyingError: nil))

对于那些没有createDate字段的记录,createDate为nil是可以的。问题是这些记录没有被添加到我的站点数组。

我试过以下方法:

  1. 为createDate
  2. 添加默认值

@ServerTimestamp var createDate: Timestamp?=nil

  1. 添加CodingKeys enum
import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift
struct MiniSite: Codable, Identifiable {

@DocumentID var id: String?
var name:String
var city: String
var country: String
var region: String? = ""
@ServerTimestamp var createDate: Timestamp?

enum CodingKeys: String, CodingKey {
case name
case city
case country
case createDate
}

}

这些对结果都没有任何影响

我不需要更新数据库,所以我也试图从createDate字段中删除@ServerTimestamp。那也没用

正如@jnpdx在注释中提供的那样,解决方案是删除@ServerTimestamp注释并使用可选的Timestamp。

改变
@ServerTimestamp var createDate: Timestamp?

var createDate: Timestamp?

最新更新