【问题标题】:How do I delete a Firestore Document from a List in SwiftUI如何从 SwiftUI 的列表中删除 Firestore 文档
【发布时间】:2021-09-13 23:55:40
【问题描述】:

这是我的视图模型

import FirebaseFirestore
import FirebaseFirestoreSwift

struct Todo: Codable, Identifiable, Hashable {
    @DocumentID var id: String?
    var todoDetais: String?
}

这就是我显示列表的方式忽略“详细信息”中的错字。

var body: some View {
    NavigationView {
        List {
            ForEach(viewModel.todos, id: \.self) { todo in
                VStack{
                    Text(todo.todoDetais!)
                }
            }
            .onDelete(perform: delete)
        }

我的获取数据和映射。

    func fetchData() {
    db.collection("todos").addSnapshotListener { (querySnapshot, error) in
        guard let documents = querySnapshot?.documents else {
            print("No documents")
            return
        }
        
        self.todos = documents.map { (QueryDocumentSnapshot)  -> Todo in
            let data = QueryDocumentSnapshot.data()
            let todoDetails = data["todo"] as? String ?? ""
            
            return Todo(todoDetais: todoDetails)
        }
    }
}

删除逻辑,我可以从列表中删除,但如何从 Firestore 中删除?

    func delete(at offsets: IndexSet) {
    viewModel.todos.remove(atOffsets: offsets)
    
    //I need to delete a firestore document at the index im removing at?
    
}

【问题讨论】:

  • 您需要保留从列表中每个项目的偏移量到其在 Firestore 中的 ID 的映射。一旦你有了deleting the document 就很容易了。我还建议此时仅将其从数据库中删除,因为这本身会强制通过 SwiftUI 重新绘制 UI。
  • ViewModel 已经有一个 @DocumentID 的包装器我不太确定通过代码我应该做什么。我已经坚持了一段时间
  • @JustinComstock 你没有展示你的视图模型的代码或你的待办事项模型代码,所以很难说会发生什么。您可以通过执行以下操作将偏移量映射到待办事项:offsets.map { viewModel.todos[$0] }。你能弄清楚如何从那里删除它们吗?
  • @jnpdx 我添加了视图模型代码,我无法弄清楚其中的删除部分。带有偏移量和删除的代码会是什么样子?
  • 您尚未添加视图模型代码,但我确实看到了 Todo 模型。我会尝试在此基础上添加答案。

标签: firebase google-cloud-firestore swiftui swiftui-list


【解决方案1】:

您可以通过执行以下操作将偏移量映射到您的 Todo 模型:

offsets.map { viewModel.todos[$0] }

因此,您的删除函数可能如下所示:

func delete(at offsets: IndexSet) {
  offsets.map { viewModel.todos[$0] }.forEach { todo in 
    guard let todoID = todo.id else { return }
    db.collection("todos").document(todoID).delete() { err in
      if let err = err {
        print("Error removing document: \(err)")
      } else {
        print("Document successfully removed!")
      }
    }
  }
}

如果你有一堆,你可以考虑批处理请求,但这应该让你开始。

【讨论】:

  • 无法使此解决方案正常工作,什么是“todoID”字段?
  • 我不知道你指的是什么。你的意思是我在哪里有todoID = todo.id?那是因为您在 Todo 模型上将 id 声明为可选。
  • 是的。当我使用断点时,它看起来像一个 UUID,所以这里的问题是我需要 DocumentID。
  • 您的文档 ID 是什么样的?我对您的 Firestore 结构以及您的文档 ID 的外观和外观一无所知。
  • "miEVaGRQ12phsINusyox" 我认为这是我缺少的映射的一部分,我为 todoDataModel 放置了@DocumentID,但分配它还不够。当我删除一个文档时,我需要根据删除的偏移量来引用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 2020-12-11
  • 1970-01-01
  • 2018-05-08
  • 2021-10-16
  • 1970-01-01
  • 2018-06-18
相关资源
最近更新 更多