swift - 当persistentContainer不在App委托方法中时如何从核心数据中删除所有数据

Posted

技术标签:

【中文标题】swift - 当persistentContainer不在App委托方法中时如何从核心数据中删除所有数据【英文标题】:How to delete all data from core data when persistentContainer is not in App delegate method in swift 【发布时间】:2020-05-30 12:13:42 【问题描述】:

我是 Swift 新手,我想从核心数据中删除所有数据。我见过几个例子,但在所有例子中persistentContainerAppDelegate 中,而在我的例子中persistentContainer 不在AppDelegate 中。它在不同的类中,如下所示:

class CoreDataStack: NSObject 
    
    static let sharedInstance = CoreDataStack()
    private override init() 
    
    func applicationDocumentsDirectory() 
        if let url = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).last 
            print(url.absoluteString)
        
    
    lazy var persistentContainer: NSPersistentContainer = 
       
        let container = NSPersistentContainer(name: "Database")
        container.loadPersistentStores(completionHandler:  (storeDescription, error) in
            if let error = error as NSError? 
                
                fatalError("Unresolved error \(error), \(error.userInfo)")
            
            print(storeDescription)
            
        )
        return container
    ()
    
    // MARK: - Core Data Saving support
    
    func saveContext () 
        let context = persistentContainer.viewContext
        if context.hasChanges 
            do 
                try context.save()
             catch 
                
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            
        
    

在 AppDelegate 方法中,我只是将其称为

CoreDataStack.sharedInstance.applicationDocumentsDirectory()

func applicationWillTerminate(_ application: UIApplication) 
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        CoreDataStack.sharedInstance.saveContext()
    

我尝试了this code,但它对我不起作用。

【问题讨论】:

【参考方案1】:

其中一种解决方案是对 persistentContainer 中的所有实体使用NSBatchDeleteRequest。您可以将这些方法添加到您的CoreDataStack

func deleteAllEntities() 
    let entities = persistentContainer.managedObjectModel.entities
    for entity in entities 
        delete(entityName: entity.name!)
    


func delete(entityName: String) 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
    do 
        try persistentContainer.viewContext.execute(deleteRequest)
     catch let error as NSError 
        debugPrint(error)
    

整个代码可以在here找到

【讨论】:

这个怎么用? 显示使用未解析标识符“managedObjectModel”使用未解析标识符“persistentStoreCoordinator” 显示此错误“NSPersistentContainer”类型的值没有成员“执行” 如何在需要的地方调用这个方法。以及如何在其中传递实体名称 您可以从项目中的任何位置调用它:CoreDataStack.sharedInstance.deleteAllEntities()

以上是关于swift - 当persistentContainer不在App委托方法中时如何从核心数据中删除所有数据的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 当布尔为真时如何移动精灵节点?

Swift:仅当键盘隐藏 TextField 或 Button 时滚动视图

当 newValue 没有分配任何内容时,为啥这个 swift 代码可以工作?

不...当 UIButton (Swift) 中的文本太长时

Swift 3:当孩子存在时,FirebaseDB 返回 nil

当 Struct 的特定属性发生突变时通知父级,Swift