如何在SwiftUI中使用documentID删除特定的Cloud Firestore文档?

问题描述

Firebase

我正在使用一个列表来显示用户通过表单输入的伤害数据,该表单已成功添加到Cloud Firestore。我现在想添加一个删除功能,以删除列表中选择的伤害。

这是我的Injury结构:

import SwiftUI
import FirebaseFirestoreSwift

struct Injury: Identifiable,Codable {
  @DocumentID var id: String? = UUID().uuidString
  var userId: String?
  var specificLocation: String
  var comment: String
  var active: Bool
  var injuryDate: Date
  var exercises: String
  var activity: String
  var location: String    
}

我的InjuriesViewModel

import SwiftUI
import Firebase
import FirebaseFirestore
import FirebaseFirestoreSwift

class InjuriesViewModel: ObservableObject {    
  @Published var injuries = [Injury]()
    
  private var db = Firestore.firestore()

  func fetchData () {
    let userId = Auth.auth().currentUser?.uid
    
    db.collection("injuries")
      .order(by: "injuryDate",descending: true)
      .whereField("userId",isEqualTo: userId)
      .addSnapshotListener{ (querySnapshot,error) in
        guard let documents = querySnapshot?.documents else {
          print("no documents")
          return
        }
                
        self.injuries = documents.compactMap { (queryDocumentSnapshot) -> Injury? in
          return try? queryDocumentSnapshot.data(as: Injury.self)
        }
    }
  }
}

我的InjuryViewModel(这是添加和删除伤害功能所在的位置,但是我不确定如何填写文档字段):

import SwiftUI
import Firebase

class InjuryViewModel: ObservableObject {    
  @Published var injury: Injury = Injury(id: "",userId: "",specificLocation: "",comment: 
    "",active: false,injuryDate: Date(),exercises: "",activity: "",location: "")
    
  private var db = Firestore.firestore()

  func addInjury(injury: Injury) {
    do {
      var addedInjury = injury
      addedInjury.userId = Auth.auth().currentUser?.uid
      let _ = try db .collection("injuries").addDocument(from: addedInjury)
    }
    catch {
      print(error)
    }
  }
      
  func deleteInjury(injury: Injury) {
    db.collection("injury").document(??).delete() { err in
      if let err = err {
        print("Error removing document: \(err)")
      } 
      else {
        print("Document successfully removed!")
      }
    }
  }
    
  func save () {
    addInjury(injury: injury)
  }
    
  func delete () {
    deleteInjury(injury: injury)
  }
}

在此先感谢您的帮助!

我在这里:

  func addInjury(injury: Injury) {        
    do {
      var addedInjury = injury
      addedInjury.userId = Auth.auth().currentUser?.uid
      let documentRef = try db.collection("injuries").addDocument(from: addedInjury)
      addedInjury.id = documentRef.documentID
      print(documentRef.documentID)
    }
    catch {
      print(error)
    }
  }

  func deleteInjury(injury: Injury) {
    db.collection("injuries").document(injury.id!).delete() { err in
    if let err = err {
      print("Error removing document: \(err)")
    }
    else {
      print("Document successfully removed!")
    }
  }
}

解决方法

deleteInjury中,您只需要访问视图模型所保存的当前documentID中的Injury

func deleteInjury(injury: Injury) {
  db.collection("injury").document(injury.id).delete() { err in
    if let err = err {
      print("Error removing document: \(err)")
    } 
    else {
      print("Document successfully removed!")
    }
  }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...