Firebase:SwiftUI操作Firestore删除数组指定对象误删整个列表问题
问题原因
- 你的Firestore中
watchlist数组存储的是包含symbol、companyName等多字段的字典对象,但你调用FieldValue.arrayRemove()时传入的是纯字符串company.symbol,二者类型、结构完全不匹配。 - 正常情况下这种写法会因为找不到匹配元素,不会删除任何内容。如果出现整个
watchlist被清空的情况,优先排查两点:- 之前调试时是否写过
updateData(["watchlist": []])这类直接覆盖数组为空白的代码,缓存未清导致实际执行的是旧逻辑 - 检查是否有其他业务代码同时操作同一份用户文档的
watchlist字段,触发了覆盖写入
- 之前调试时是否写过
正确实现方案
你需要构造和Firestore中存储的待删除对象完全一致的字典(所有字段的键、值、类型都要完全匹配),再传入arrayRemove,示例代码如下:
func removeFromWatchlist() { guard let uid = Auth.auth().currentUser?.uid else { return } let docRef = db.collection("user").document(uid) // 构造和Firestore存储结构完全匹配的待删除对象 let targetCompany: [String: Any] = [ "symbol": company.symbol, "companyName": company.companyName, "price": company.price, // 补全该对象在Firestore中存储的所有其他字段,不能缺漏 ] docRef.updateData(["watchlist": FieldValue.arrayRemove([targetCompany])]) { error in if let error = error { print("删除失败: \(error.localizedDescription)") return } print("指定标的已从 watchlist 移除") } }
优化建议
如果经常需要按股票代码删除标的,更推荐你把watchlist改成以symbol为key的字典结构,后续删除不需要匹配整个对象,容错率更高,写法如下:
// 删除时直接指定对应symbol的key即可 docRef.updateData(["watchlist.\(company.symbol)": FieldValue.delete()])
内容的提问来源于stack exchange,提问作者gavisio
相关产品推荐
相关产品推荐

