swift - 从 Firestore 中删除数组项
问题描述
我花了几天的时间研究这个问题,包括各种答案,比如:Firebase Firestore:从文档数组中追加/删除项目, 但无法弄清楚如何真正让它工作。
我有两个结构:
struct TestList : Codable {
var title : String
var color: String
var number: Int
}
struct TestGroup: Codable {
var items: [TestList]
}
我可以使用以下方法添加数据FieldValue.arrayUnion
:
@objc func addNewItem() {
let testList = TestList(title: "Testing", color: "blue", number: Int.random(in: 1..<999))
let docRef = FirestoreReferenceManager.simTest.document("abc")
docRef.updateData([
"items" : FieldValue.arrayUnion([["title":testList.title,
"color":testList.color,
"number":testList.number]])
])
}
上述工作如 Firestore 仪表板中所反映:
但是,如果我尝试删除数组中的一项,它就是行不通的。
@objc func removeItem() {
let docRef = FirestoreReferenceManager.simTest.document("abc")
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.arrayUnion([["title" : itemToRemove.title,
"color" : itemToRemove.color,
"number" : itemToRemove.number]])
]) { error in
if let error = error {
print("error: \(error)")
} else {
print("successfully deleted")
}
}
} catch {
}
}
}
我已将 打印itemToRemove
到日志以检查它是否正确。但它只是不会将其从 Firestore 中删除。没有返回错误,但"successfully deleted"
已记录。
请注意,上面是测试代码,因为我已经简化了我实际需要的只是为了测试目的,因为我无法让它工作。
关于我在这里做错了什么的任何想法?
解决方案
您必须使用arrayRemove
从数组中删除项目。
@objc func removeItem() {
let docRef = FirestoreReferenceManager.simTest.document("abc")
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([["title" : itemToRemove.title,
"color" : itemToRemove.color,
"number" : itemToRemove.number]])
]) { error in
if let error = error {
print("error: \(error)")
} else {
print("successfully deleted")
}
}
} catch {
}
}
}
我遇到过这种简单的方法不起作用的情况,因为该项目是一个复杂的对象,在这种情况下,我首先必须从 Firestore 查询该项目并将该实例插入arrayRemove()
以将其删除。
您的方法没有任何副作用的原因是 Firestore 中的数组与 Swift 中的数组不同,它们是数组和集合的混合体。您可以在 Firestore 中使用重复项初始化数组,但不能使用arrayUnion()
重复项追加数组。尝试使用附加重复项arrayUnion()
将静默失败,例如在您的情况下。
推荐阅读
- javascript - 使用带有回调函数的 async/await
- java - Java - MariaDB 使用 Hibernate 标准执行缓慢
- python - 'unlink()' 在 Windows 上的 Python 的 shared_memory 中不起作用
- reactjs - 在反应应用程序中获取快照侦听器错误
- typescript - 如何将已定义的接口与 io-ts 库一起使用?
- javascript - 根据允许的值/字符串数组验证字符串
- php - 在textarea中按Enter时如何添加一行而不是空格?
- java - 如果我们从地图上掉下来,二维数组和检测(JAVA)
- json - 从维基百科获取标题
- java - 如何确定在 recycelview 布局上单击了哪个卡片视图?