【问题标题】:Deleting all data in a Core Data entity in Swift 3在 Swift 3 中删除核心数据实体中的所有数据
【发布时间】:2017-02-16 15:54:07
【问题描述】:

有没有办法批量删除存储在核心数据中所有实体中的所有数据?

我在某处读到,在 iOS 9 或 10 中,苹果引入了一种批量删除的方法,但我似乎找不到任何好的信息。

最终,我只需要一个遍历实体并删除其中所有数据的函数。看起来它应该足够简单,但事实证明它的文档/教程非常难以找到。

有什么想法吗?

编辑

我将以下代码添加到附加到按钮的 IBAction 中:

@IBAction func clearAllData(_ sender: AnyObject) {
    let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "PLProjects")
    let request = NSBatchDeleteRequest(fetchRequest: fetch)

    //get the data from core data
    getPLData()

    //reload the table view
    tableView.reloadData()
}

但这似乎不起作用。如果我关闭项目并重新打开它,数据仍然存在。我假设这也是表格视图不更新的原因,因为数据实际上并没有被删除。

【问题讨论】:

    标签: core-data swift3 ios10 xcode8


    【解决方案1】:

    你想到的是NSBatchDeleteRequest,它是在 iOS 9 中添加的。像这样创建一个:

    let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Employee")
    let request = NSBatchDeleteRequest(fetchRequest: fetch)
    

    如果您只想删除与谓词匹配的实例,也可以添加谓词。运行请求:

    let result = try managedObjectContext.executeRequest(request)
    

    请注意,批处理请求不会更新您当前的任何应用状态。如果您在内存中有受删除影响的托管对象,则需要立即停止使用它们。

    【讨论】:

    • 我编辑了我的帖子以显示我使用的代码 - 但这似乎对我不起作用。基本上我有一个 UITableView 加载到我的视图控制器中,我在一个名为“PLProjects”的实体中显示所有“项目”。我在屏幕上还有一个带有 IBAction 关联的按钮实例。我的评论中的更新显示了 IBAction 中的代码——它无法从核心数据实体中删除项目,也无法更新表。
    • 创建请求是不够的。你也必须执行它。请求不会自动运行,它们会在您告诉它们运行时运行。
    • 啊,对不起。我误解了你最初发布的内容。我以为代码的第二个 sn-p 是添加谓词。那么 - 话虽如此 - 在第二个 sn-p 中,“moc”是什么?
    【解决方案2】:

    为了充实汤姆的回复,这是我添加的完整例程:

    func deleteAllRecords() {
        let delegate = UIApplication.shared.delegate as! AppDelegate
        let context = delegate.persistentContainer.viewContext
    
        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "CurrentCourse")
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
    
        do {
            try context.execute(deleteRequest)
            try context.save()
        } catch {
            print ("There was an error")
        }
    }
    

    【讨论】:

    • 你不应该使用委托变量来声明上下文吗?
    • 我已经使用上面的代码删除了记录,但是在下一行我获取记录时,我正在获取记录。可能是因为它的异步行为。你知道如何解决这个问题吗?
    【解决方案3】:

    在你的 CoreDataManager 中声明获取上下文的方法 类

         class func getContext() -> NSManagedObjectContext {
                guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
                    return NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
                }
                if #available(iOS 10.0, *) {
                    return appDelegate.persistentContainer.viewContext
                } else {
                    return appDelegate.managedObjectContext
                }
            }
    

    从你的 NSManagedObject 子类中调用上述方法:

        class func deleteAllRecords() {
                //getting context from your Core Data Manager Class
                let managedContext = CoreDataManager.getContext()
                let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Your entity name")
                let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
                do {
                    try managedContext.execute(deleteRequest)
                    try managedContext.save()
                } catch {
                    print ("There is an error in deleting records")
                }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 2014-08-30
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      相关资源
      最近更新 更多