【问题标题】:Swift: How to use FieldValue.serverTimestamp() in document().setData() Firestore database?Swift:如何在 document().setData() Firestore 数据库中使用 FieldValue.serverTimestamp()?
【发布时间】:2022-08-17 00:47:57
【问题描述】:

我想要做的就是在setData() 中设置一个 Firebase 服务器时间戳,但我似乎无法弄清楚如何让它工作。

这是我尝试过的:

for document in snapshot!.documents {
    do {
        try document.reference.collection(\"Data\").document()
           .setData(from: [\"first\" : FieldValue.serverTimestamp(), \"second\" : dataStringArray])

        print(\"Data successfully written to firestore.\")
    } catch let error {
        print(\"Error writing data to firestore: \\(error)\")
    }
}

目的是在每次写入数据时将 serverTimestamp 设置为字段,以获取数据写入的历史记录。

它一直显示错误Type of expression is ambiguous without more context,所以我尝试通过将其转换为FieldValue 来给它一些上下文,但后来我得到了相同的ambiguous without more context 问题,所以我尝试将它转换为ServerTimestampTimestamp,我得到了Cannot convert value of type \'FieldValue\' to type \'Timestamp\' in coercion

它在 Android 中运行良好,只需执行以下操作:

document.reference.collection(\"Data\").document().set(FieldValue.serverTimestamp() to formattedDataList)

但由于某种原因,它在 Swift 中不起作用。我一直在寻找几个小时试图理解这个问题,但一直没有找到一个好的解释。

我也试过这个:

setData(from: [FieldValue.serverTimestamp() : dataStringArray])

但我得到Error writing data to firestore: invalidValue([<FSTServerTimestampFieldValue: 0x280412de0>:

  • 没有\"second\": dataStringArray 字段你能做到吗?
  • 在 iOS 上,您应该使用 Codable 结构来表示您的 Firestore 文档。您可以为您的时间戳添加一个property,如果它是nil,那么它将由服务器填写
  • @AhmedShendy 我可以在没有“第二”部分的情况下做到这一点,但我需要包含 dataStringArray。
  • @Paulw11 所以我要做的就是设置一个firebase服务器时间戳,让它可编码?我不太确定该怎么做。你知道有什么好的资源来学习吗?

标签: ios swift firebase google-cloud-firestore timestamp


【解决方案1】:

其实我是想写个评论的,但是由于限制不能加代码sn-ps,就变成了答案。如果这不是真正适合您的答案,请原谅我。

在我的应用程序中的聊天中,我使用 Date 作为 sendDate(请参见下面我的代码中的示例),这对您来说不是一个选项吗?

func addNewChatMessageFromData( _ id: String,
                                _ chatId: String,
                                _ messageText: String,
                                _ messageType: String,
                                _ usersIds: [String],
                                _ senderId: String,
                                _ senderName: String,
                                _ lastSenderImageLink: String,
                                _ sendDate: Date
) {
    do {
        
        let chatMessageRef = db.collection("chatMessages").document().documentID
        
        let newChatMessage = ChatMessageFB(chatMessageRef, chatId, messageText, messageType, usersIds, senderId, senderName, lastSenderImageLink, sendDate)
        
        try db.collection("chatMessages").document(chatMessageRef).setData(from: newChatMessage) { _ in
            print("Successful writing ChatMessage to Firestore")
        }
        
        
    } catch let error {
        print("Error writing ChatMessage to Firestore: \(error)")
    }
}

最好的,塞巴斯蒂安

【讨论】:

  • serverTimeStamp 让服务器填写时间戳,与您设备上的日期/时间无关。
  • @Paulw11,是的,对不起,我没有考虑到这一点
【解决方案2】:

问题是我使用setData(from:) 而不是简单地使用setData()

改变这个

.setData(from: ["first" : FieldValue.serverTimestamp(), "second" : dataStringArray])

对此

.setData(["first" : FieldValue.serverTimestamp(), "second" : dataStringArray])

完全解决了我的问题。

看来我正在尝试使用旨在简化制作自定义对象的扩展,但由于某种原因它没有添加到文档中。我用错了,因为我试图像文档中的那样使用它。

这个 StackOverflow Question 解释了更多关于这个问题的信息。 Error when trying to call setData(from: ) in the Cloud Firestore ios API. How can i fix it?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2018-12-29
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多