You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中更新Firebase跨用户共享报告提示找不到文档问题

问题根因

更新接口写的Firestore文档路径和你实际存报告的路径完全不一致,当然找不到目标文档。

  • 你写的报告插入逻辑,是把所有报告存在用户文档下的子集合里,完整路径是 users/[转义后的用户邮箱]/reports/[报告唯一ID]
  • 但更新逻辑里,你直接去根目录下的reports集合找文档,这个集合你从来没写过数据进去,查不到是必然的。
  • 另外你原来的更新方法根本没调用传入的completion回调,外层页面根本拿不到更新成功还是失败的结果。
修复方法
  1. 给更新方法补入参:报告创建者的邮箱,和插入方法的入参规则保持一致,用来拼对正确的文档路径
  2. 把更新的文档路径改成和插入逻辑完全一致的层级
  3. 补上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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:51:22