Swift中更新Firebase跨用户共享报告提示找不到文档问题
问题根因
更新接口写的Firestore文档路径和你实际存报告的路径完全不一致,当然找不到目标文档。
- 你写的报告插入逻辑,是把所有报告存在用户文档下的子集合里,完整路径是
users/[转义后的用户邮箱]/reports/[报告唯一ID] - 但更新逻辑里,你直接去根目录下的
reports集合找文档,这个集合你从来没写过数据进去,查不到是必然的。 - 另外你原来的更新方法根本没调用传入的
completion回调,外层页面根本拿不到更新成功还是失败的结果。
修复方法
- 给更新方法补入参:报告创建者的邮箱,和插入方法的入参规则保持一致,用来拼对正确的文档路径
- 把更新的文档路径改成和插入逻辑完全一致的层级
- 补上completion回调的调用,把更新结果返回给上层页面
修正后的完整更新代码:
private let database = Firestore.firestore() private init() {} // UPDATE REPORT public func updateTheData( reportPost: ReportPost, creatorEmail: String, completion: @escaping (Bool) -> Void ){ // 和插入逻辑保持一致,转义邮箱特殊字符作为用户文档ID let userEmail = creatorEmail .replacingOccurrences(of: ".", with: "_") .replacingOccurrences(of: "@", with: "_") let data = [ "id": reportPost.identifier, "title": reportPost.title, "timestamp1": reportPost.timestamp1, "address": reportPost.address, "customerPO": reportPost.customerPO, "authNum": reportPost.authNum, "contactName": reportPost.contactName, "contactPhone": reportPost.contactPhone, "modelNum": reportPost.modelNum, "serialNum": reportPost.serialNum, "addInfo": reportPost.addInfo, "equipProblem": reportPost.equipProblem, "action": reportPost.action, "followUp": reportPost.followUp, "techName1": reportPost.techName1, "techName2": reportPost.techName2, "techName3": reportPost.techName3, "techName4": reportPost.techName4, "timestamp2": reportPost.timestamp2, "timestamp3": reportPost.timestamp3, "timestamp4": reportPost.timestamp4, "milesTraveled1": reportPost.milesTraveled1, "milesTraveled2": reportPost.milesTraveled2, "milesTraveled3": reportPost.milesTraveled3, "milesTraveled4": reportPost.milesTraveled4, "travelTime1": reportPost.travelTime1, "travelTime2": reportPost.travelTime2, "travelTime3": reportPost.travelTime3, "travelTime4": reportPost.travelTime4, "siteTime1": reportPost.siteTime1, "siteTime2": reportPost.siteTime2, "siteTime3": reportPost.siteTime3, "siteTime4": reportPost.siteTime4, "serviceType1": reportPost.serviceType1, "serviceType2": reportPost.serviceType2, "serviceType3": reportPost.serviceType3, "serviceType4": reportPost.serviceType4, "timeTotal1": reportPost.timeTotal1, "timeTotal2": reportPost.timeTotal2, "timeTotal3": reportPost.timeTotal3, "timeTotal4": reportPost.timeTotal4, "partNum1": reportPost.partNum1, "partNum2": reportPost.partNum2, "partNum3": reportPost.partNum3, "partNum4": reportPost.partNum4, "quantity1": reportPost.quantity1, "quantity2": reportPost.quantity2, "quantity3": reportPost.quantity3, "quantity4": reportPost.quantity4, "price1": reportPost.price1, "price2": reportPost.price2, "price3": reportPost.price3, "price4": reportPost.price4, "priceTotal1": reportPost.priceTotal1, "priceTotal2": reportPost.priceTotal2, "priceTotal3": reportPost.priceTotal3, "priceTotal4": reportPost.priceTotal4, ] // 路径和插入逻辑完全对齐 let docRef = database .collection("users") .document(userEmail) .collection("reports") .document(reportPost.identifier) docRef.updateData(data) { error in if let error = error { print("Error updating document: \(error)") completion(false) } else { print("Document successfully updated") completion(true) } } }
后续实现跨用户编辑的注意点
你现在的表结构是每个用户的报告存在自己的私有子集合下,如果要实现所有用户都能查看、编辑其他人的报告,要么在拉取列表时遍历所有用户的reports子集合加载全量报告(数据量上来之后性能会很差),要么新建一个根级的reports集合存所有报告的全量数据,同时给每个文档加上创建者ID、权限字段,配合Firestore安全规则做访问控制,实现起来更合理。
另外你之前传的thisReport参数最好删掉,直接用reportPost.identifier当文档ID,避免传参时把ID传错。
内容的提问来源于stack exchange,提问作者Sam MacInnes
相关产品推荐
相关产品推荐

