【问题标题】:Remove all record in CoreData Entity删除 CoreData 实体中的所有记录
【发布时间】:2020-06-29 05:35:28
【问题描述】:

我正在尝试使用 SwiftUI 在我的应用中实现 CoreData。

我创建了具有两个属性 icaoAPT 和 iataAPT 的实体 Aeroporti

我的应用从 Firebase 数据库下载一些数据并将数据保存在本地以供离线使用。

我设法将所有数据保存在实体 Aeroporti 中,但现在我想创建一个函数来删除所有存储的数据,然后用户再次下载更新的数据。

我设法使用 func cancella() 直接在 contentView 中删除单个索引处的数据。

但现在我在 DataManager 中遇到了 func delate all 的问题。


import SwiftUI
import CoreData

struct ContentView: View {
    @ObservedObject var dm : DataManager
    @Environment(\.managedObjectContext) var managedObjectContext
    
    @FetchRequest(entity: Aeroporti.entity(),
                  sortDescriptors: [NSSortDescriptor(keyPath: \Aeroporti.iataAPT, ascending: true)]) var aeroport : FetchedResults<Aeroporti> // crea la variabile che contiene le ricette
   
    var body: some View {
        VStack{
              HStack{
                
                Button(action: {
                    DataManager.shared.downloadData(dbCore: self.managedObjectContext)
                }) {
                    Text("save from manager")
                }
                
                Spacer()
                
                Button(action: {
                    DataManager.shared.delateALL(dbCore: self.managedObjectContext)
                }) {
                    Text("del all")
                }
                
                
            }
        List{
          
            ForEach(aeroport, id: \.self) { apt in
                VStack{
                Text(apt.iataAPT ?? "sconosciuto")
                Text(apt.icaoAPT ?? "sconosciuto")
                }
            }
            .onDelete(perform: cancella)
        }
        
    }
    
    }
    // this delate at single index
    func cancella(at offset : IndexSet) { //1 ricevo indice ricetta , indexset è un array di indici
           
           for index in offset { // 2 ciclo dentro l'array offset con dentro gli indici
              let apt = aeroport[index] // 3 tiro furoi la ricetta a quel indice
               
               managedObjectContext.delete(apt) // 7 cancella alla fine la ricetta
           }
           do { // 8 salvo
               try self.managedObjectContext.save()
              
              
           } catch {
               debugPrint(error.localizedDescription)
           }
       }
}

我想删除实体 Aeroporti 中的所有记录,我试图写这个,但我当然卡住了:

class DataManager:  ObservableObject {
    
    let objectWillChange = PassthroughSubject<Void, Never>()
    let db = Firestore.firestore()
    static let shared = DataManager()
    

    
    // get data from Firestore and Save locally
    func downloadData(dbCore: NSManagedObjectContext ) {
    
            db.collection("VHHH").document("VHHHid").getDocument { (document, error) in
                if error == nil {
                    if document != nil && document!.exists  {
    
                        let data = document!.data()

    
                        let icaoAPT = data?["icaoAPT"] ?? "empty"
                        let iataAPT = data?["iataAPT"] ?? "empty"
    
                        let aeroporto = Aeroporti(context: dbCore)
                        aeroporto.icaoAPT = icaoAPT as? String
                        aeroporto.iataAPT = iataAPT as? String
    
                        debugPrint(aeroporto.iataAPT!)
                        
                        do {
                            try dbCore.save()
                            print("Saved Data")
                        } catch {
                            
                            let nserror = error as NSError
                            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
                        }
                    }
                }
            }
        }
    

    // test delate all...NOT WORKING
    func delateALL(dbCore: NSManagedObjectContext, vett: FetchedResults<NSFetchRequestResult>){
 
//        let req = NSFetchRequest<NSFetchRequestResult>(entityName: "Aeroporti")
        
         // 3 tiro furoi la ricetta a quel indice
        for data in vett {
          let data1 = vett[0]
//            dbCore.delete(data1)
        }
    }

    // delate all but not update
//    func delateALL2(dbCore: NSManagedObjectContext){
//        let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Aeroporti")
//        let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
//
//
//        do {
//            try dbCore.execute(deleteRequest)
//            debugPrint("canx all")
//
//            do {
//                try dbCore.save()
//                print("Saved Data")
//            } catch {
//
//                let nserror = error as NSError
//                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
//            }
//
//        } catch let error as NSError {
//            debugPrint(error)
//        }
//
//    }

}

谢谢你的帮助

【问题讨论】:

    标签: swift xcode core-data save swiftui


    【解决方案1】:
    func deleteRecords() {
            // References to context
            let context = App.persistency.container.viewContext
    
            let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Aeroporti")
            let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
    
            do {
                try context.persistentStoreCoordinator?.execute(deleteRequest, with: context)
            } catch let error as NSError {
                print("Fetch failed. \(error.localizedDescription)")
            }
        }
    

    为了更新您的 UI,您可以进行如下操作:

    1. 创建一个@State private var airportCount: Int?
    2. 在您的 body content 中,添加一个 onAppear(_:) 修饰符,并在加载视图后将您在数据库中的正确机场总数添加到 airportCount。
    3. 当您调用方法 deleteRecords() 时,请务必使用新数字 (0) 更新您的 airportCount 变量,您的视图将会更新。

    就是这样。视图应该重新加载。

    【讨论】:

    • 它可以工作,但是 contentView 没有立即更新.. 只有在重新启动应用程序后才会为空
    • 哦,好吧,我编辑我的答案是为了更新 UI。实现视图更新的方法有很多,但是这个比较简单。
    猜你喜欢
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    相关资源
    最近更新 更多