Swift:如何在document().setData()Firestore数据库中使用FieldValue.serve



我只想在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

简单地做到这一点在安卓系统中效果很好:

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

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

我也试过这个:

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

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

实际上我想写一条注释,但由于无法添加代码片段的限制,它成为了一个答案。如果这不是真正适合你的答案,请原谅我。

在我的应用程序中的聊天中,我使用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)")
}
}

最佳,Sebastian

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

更改此

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

到这个

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

完全解决了我的问题。

我似乎试图使用一个扩展来简化定制对象的制作,但由于某种原因,它没有添加到文档中。我用错了,因为我试图像文档中那样使用它。

这个StackOverflow问题进一步解释了这个问题。尝试调用Cloud Firestore ios API中的setData(from:(时出错。我该怎么修?

最新更新