SwiftUI Core Data 删除实体的相关数据

Posted

技术标签:

【中文标题】SwiftUI Core Data 删除实体的相关数据【英文标题】:SwiftUI Core Data Delete related Data of entity 【发布时间】:2020-07-04 12:44:28 【问题描述】:

我正在努力删除 SwiftUI 中的相关实体数据。 我有 2 个相关实体。 Bean(主要实体) 镜头(相关实体) 多对一 --> 每个 bean 都会有很多镜头

当我尝试构建和运行时,我收到 bean 未解析的错误。

这是我的代码:

import SwiftUI

struct ShotList: View 
    
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(entity: Bean.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Bean.name, ascending: true)]) var beans: FetchedResults<Bean>
    
    static let taskDateFormat: DateFormatter = 
        let formatter = DateFormatter()
        formatter.dateStyle = .long
        return formatter
    ()
    
    var body: some View 
        NavigationView 
            List 
                ForEach(beans, id: \.self)  bean in
                    Section(header: HStack 
                            Text(bean.wrappedName)
                            Text(bean.wrappedRoaster)) 
                        ForEach(bean.shotArray, id: \.self)  shot in
                            HStack 
                                Text(shot.wrappedTaste)
                                Text(shot.wrappedTexture)
                                Text("\(shot.yield, specifier: "%.0f") g")
                                Text("\(shot.doseAmount, specifier: "%.0f") g")
                                Text("\(shot.bruRatio, specifier: "%.0f")")
                                Text("\(shot.time, specifier: "%.0f") s")
                                Spacer()
                                Text("\(shot.dateOfShot ?? Date(), formatter: ShotList.taskDateFormat)").font(.footnote)                                   
                                                           
                        .onDelete(perform: self.deleteShot)
                        .font(.body)
                    
                
            .navigationBarTitle("Espresso Shotlist")
        
    
    
    func deleteShot(at offset: IndexSet) 
            for offset in offset 
                let shot = bean.shotArray[offset]
                moc.delete(shot)
            
        try? moc.save()
          


struct ShotList_Previews: PreviewProvider 
    static var previews: some View 
        ShotList()
    

【问题讨论】:

由于代码中有多种形式的“bean”,请您指出出错的代码行。 这是行:let shot = bean.shotArray[offset] 尝试将 bean 作为参数传递给 deleteShot 函数,这样您就可以这样调用它:self.deleteShot(bean: bean, at: indexSet)。使用这些参数相应地调整 deleteShot 函数定义,然后您应该在函数中包含所有必要的信息并且代码应该可以工作。 谢谢,以后试试。 还有一件事:将 .oneDelete(...) 更改为 .onDelete() indexSet in self.deleteShot(bean: bean, at: indexSet) 。祝你好运。 【参考方案1】:

bean 只能在闭包中访问: ForEach(beans, id: .self) bean in

它在 func deleteShot 中不可用。

【讨论】:

以上是关于SwiftUI Core Data 删除实体的相关数据的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI从Core Data实体中获取总项目(SQL术语中的行)计数[重复]

SWIFTUI Core Data 传递数字

如果从 Core Data SwiftUI 中删除,则删除本地通知

Core Data 更改时更新 Swiftui 视图

当我删除相关对象时,为啥 Core Data 会复活已删除的对象?

SwiftUI Core Data 在 DetailView 中绑定 TextFields