# #swift #firebase #google-cloud-firestore #timestamp #codable
Вопрос:
У меня возникли проблемы с присвоением значения по умолчанию типу данных метки времени 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 взят из видео Питера Фриза «Создайте приложение со списком дел с помощью 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 является необязательным в моей базе данных, поэтому я определил его в своей модели соответствующим образом
@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. Проблема в том, что эти записи не добавляются в массив моих сайтов.
Я попробовал следующее:
- Добавление значения по умолчанию для CreateDate
@ServerTimestamp var createDate: Timestamp?=nil
- Добавление перечисления кодовых ключей
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
}
}
Ни то, ни другое не оказало никакого влияния на результаты
Мне не нужно обновлять базу данных, поэтому я также попытался удалить метку @ServerTimestamp из поля CreateDate. Это тоже не помогло
Комментарии:
1.Вы пробовали удалить
@ServerTimestamp
и сделать его необязательным (Timestamp?
)?2. Нет, я этого не пробовал, и это решает проблему. Спасибо @jnpdx за вашу помощь!
Ответ №1:
Как указано @jnpdx в комментариях, решение состоит в том, чтобы удалить аннотацию @ServerTimestamp и использовать необязательную метку времени.
Изменить
@ServerTimestamp var createDate: Timestamp?
Для
var createDate: Timestamp?