我花了几天时间研究这个问题,包括各种答案,例如:Firebase Firestore:从文档数组中追加/删除项目以及我之前的问题:从 Firestore 中删除数组项但无法弄清楚如何真正使其发挥作用。事实证明,问题在于对象中存在日期属性,如下所示:
我有两个结构:
struct TestList : Codable {
var title : String
var color: String
var number: Int
var date: Date
var asDict: [String: Any] {
return ["title" : self.title,
"color" : self.color,
"number" : self.number,
"date" : self.date]
}
}
struct TestGroup: Codable {
var items: [TestList]
}
我可以使用添加数据FieldValue.arrayUnion
:
@objc func addAdditionalArray() {
let testList = TestList(title: "Testing", color: "blue", number: Int.random(in: 1..<999), date: Date())
let docRef = FirestoreReferenceManager.simTest.document("def")
docRef.updateData([
"items" : FieldValue.arrayUnion([["title":testList.title,
"color":testList.color,
"number":testList.number,
"date": testList.date]])
])
}
上述工作原理如 Firestore 仪表板所示:
但如果我尝试删除数组中的一项,它就不起作用。
@objc func deleteArray() {
let docRef = FirestoreReferenceManager.simTest.document("def")
docRef.getDocument { (document, error) in
do {
let retrievedTestGroup = try document?.data(as: TestGroup.self)
let retrievedTestItem = retrievedTestGroup?.items[1]
guard let itemToRemove = retrievedTestItem else { return }
docRef.updateData([
"items" : FieldValue.arrayRemove([itemToRemove.asDict])
]) { error in
if let error = error {
print("error: \(error)")
} else {
print("successfully deleted")
}
}
} catch {
}
}
}
我已经打印了itemToRemove
到日志来检查它是否正确。但它只是不会将其从 Firestore 中删除。没有返回错误,但是"successfully deleted"
已记录。
我尝试了不同的变体,只要结构/对象中没有日期属性,此代码就可以工作。当我添加日期字段时,它就会中断并停止工作。关于我在这里做错了什么有什么想法吗?
请注意:我已尝试传递上述字段值FieldValue.arrayUnion
以及对象FieldValue.arrayRemove
无论我使用哪种方法,同样的问题仍然存在。