iOS:删除所有核心数据Swift

Pra*_*eek 54 core-data ios swift

关于如何删除swift中的所有核心数据,我有点困惑.我创建了一个带IBAction链接的按钮.点击按钮我有以下内容:

let appDel: foodforteethAppDelegate = UIApplication.sharedApplication().delegate as foodforteethAppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext
Run Code Online (Sandbox Code Playgroud)

然后我用各种方法搞砸了尝试删除所有核心数据内容,但我似乎无法让它工作.我已经使用removeAll从存储的数组中删除但仍然无法从核心数据中删除.我假设我需要某种类型的for循环但不确定如何从请求中创建它.

我尝试应用删除单行的基本原则

func tableView(tableView: UITableView!, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath!) {

    let appDel: foodforteethAppDelegate = UIApplication.sharedApplication().delegate as foodforteethAppDelegate
    let context:NSManagedObjectContext = appDel.managedObjectContext

    if editingStyle == UITableViewCellEditingStyle.Delete {

        if let tv = tblTasks {
            context.deleteObject(myList[indexPath!.row] as NSManagedObject)
            myList.removeAtIndex(indexPath!.row)
            tv.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
        }

        var error: NSError? = nil
        if !context.save(&error) {
            abort()
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

但是,这个问题是当我单击一个按钮时,我没有indexPath值,而且我还需要遍历所有我无法用上下文做的值.

Raj*_*han 51

试试这个简单的方案:

func deleteAllData(entity: String)
{
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let fetchRequest = NSFetchRequest(entityName: entity)
    fetchRequest.returnsObjectsAsFaults = false

    do 
    {
        let results = try managedContext.executeFetchRequest(fetchRequest)
        for managedObject in results
        {
            let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
            managedContext.deleteObject(managedObjectData)
        }
    } catch let error as NSError {
        print("Detele all data in \(entity) error : \(error) \(error.userInfo)")
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特4

func deleteAllData(_ entity:String) {
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
    fetchRequest.returnsObjectsAsFaults = false
    do {
        let results = try dataController.viewContext.fetch(fetchRequest)
        for object in results {
            guard let objectData = object as? NSManagedObject else {continue}
            dataController.viewContext.delete(objectData)
        }
    } catch let error {
        print("Detele all data in \(entity) error :", error)
    }
}
Run Code Online (Sandbox Code Playgroud)

执行:

 self.deleteAllData("your_entityName")
Run Code Online (Sandbox Code Playgroud)

  • 错误答案:删除核心数据并不意味着它将仅包含单个实体 (2认同)

小智 23

您可以destroyPersistentStoreiOS 9.0Swift 3开始使用:

public func clearDatabase() {
    guard let url = persistentContainer.persistentStoreDescriptions.first?.url else { return }
    
    let persistentStoreCoordinator = persistentContainer.persistentStoreCoordinator

     do {
         try persistentStoreCoordinator.destroyPersistentStore(at:url, ofType: NSSQLiteStoreType, options: nil)
         try persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
     } catch {
         print("Attempted to clear persistent store: " + error.localizedDescription)
     }
}
Run Code Online (Sandbox Code Playgroud)

  • 您好,这工作得很好,但是如果我们将 CoreData 与 CloudKit 一起使用,这不会删除 CloudKit 数据,您能给我解决方案吗? (2认同)

Suj*_*U N 22

要删除所有数据,您可以使用NSBatchDeleteRequest

func deleteAllData(entity: String)
{
    let ReqVar = NSFetchRequest(entityName: entity)
    let DelAllReqVar = NSBatchDeleteRequest(fetchRequest: ReqVar)
    do { try ContxtVar.executeRequest(DelAllReqVar) }
    catch { print(error) }
}
Run Code Online (Sandbox Code Playgroud)

  • 出现错误。删除规则不支持批量删除 (2认同)

Pra*_*eek 17

我使用以下方法工作:

@IBAction func btnDelTask_Click(sender: UIButton){

    let appDel: foodforteethAppDelegate = UIApplication.sharedApplication().delegate as foodforteethAppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext  
    let request = NSFetchRequest(entityName: "Food")

    myList = context.executeFetchRequest(request, error: nil)


    if let tv = tblTasks {

        var bas: NSManagedObject!

        for bas: AnyObject in myList
        {
           context.deleteObject(bas as NSManagedObject)
        }

        myList.removeAll(keepCapacity: false)

        tv.reloadData()
        context.save(nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这是否是最好的方法.我也收到一个'常数'bas'被推断为有任何对象的错误 - 所以如果有任何解决方案,那么它会很棒

编辑

修改为更改为bas:AnyObject


ans*_*ing 13

对于 Swift 3.0

func DeleteAllData(){


    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedContext = appDelegate.persistentContainer.viewContext
    let DelAllReqVar = NSBatchDeleteRequest(fetchRequest: NSFetchRequest<NSFetchRequestResult>(entityName: "Entity"))
    do {
        try managedContext.execute(DelAllReqVar)
    }
    catch {
        print(error)
    }
}
Run Code Online (Sandbox Code Playgroud)


rmo*_*ney 6

这是我根据 Jayant Dash 出色(且全面)的答案清除 Swift 3 中所有核心数据的实现。由于仅支持 iOS10+,因此更简单。它删除所有核心数据实体,而无需对其进行硬编码。

public func clearAllCoreData() {
    let entities = self.persistentContainer.managedObjectModel.entities
    entities.flatMap({ $0.name }).forEach(clearDeepObjectEntity)
}

private func clearDeepObjectEntity(_ entity: String) {
    let context = self.persistentContainer.viewContext

    let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)

    do {
        try context.execute(deleteRequest)
        try context.save()
    } catch {
        print ("There was an error")
    }
}
Run Code Online (Sandbox Code Playgroud)


Amu*_*608 6

在 Swift 3.0 中

 func deleteAllRecords() {
        //delete all data
        let context = appDelegate.persistentContainer.viewContext

        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "YourClassName")
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)

        do {
            try context.execute(deleteRequest)
            try context.save()
        } catch {
            print ("There was an error")
        }
    }
Run Code Online (Sandbox Code Playgroud)


Oly*_*tre 6

斯威夫特 5.1

这里的大多数帖子都建议创建一个函数来按名称删除所有实体,然后按名称删除所有实体。像这样:

resetEntity(named: "MyEntity1")
resetEntity(named: "MyEntity2")
resetEntity(named: "MyEntity3")
...
Run Code Online (Sandbox Code Playgroud)

但是,如果真正的问题是如何一次性清理所有 CoreData 实体,我建议您遍历实体名称:

// Supposing this is a CoreDataController/CoreDataStack class where you have access to `viewContext` and `persistantContainer`
// Otherwise just pass the `persistantContainer` as a parameter, from which you can also retrieve the `viewContext` 
func resetAllCoreData() {

     // get all entities and loop over them
     let entityNames = self.persistentContainer.managedObjectModel.entities.map({ $0.name!})
     entityNames.forEach { [weak self] entityName in   
        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)

        do {
            try self?.context.execute(deleteRequest)
            try self?.context.save()
        } catch {
            // error
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助