2014-07-09 90 views
42

我对如何在swift中删除所有核心数据感到有点困惑。我创建了一个链接IBAction的按钮。在按钮的点击,我有以下:iOS:删除所有核心数据Swift

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

然后我用各种方法好惹的尝试,并删除所有的核心数据内容,但我似乎无法得到它的工作。我已经使用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() 
     } 

    } 

} 

但是基本原则,这个问题是,当我点击一个按钮,我没有indexPath价值,也是我需要循环所有的值,我似乎无法处理上下文。

+0

可能重复核心数据?](http://stackoverflow.com/questions/1077810/delete-reset-all-entries-in-core-data) – Jack

+1

这是正常的目标-c。我试图在Swift中重新创建它,但它不是以同样的方式工作并令我困惑:/ – Prateek

+0

那么向我们展示一些您在Swift中尝试过的各种方法,或许我们可以帮助您。就API和如何做到这一点而言,这个问题可以解决所有问题,并且只需在Swift中做同样的事情。 – Jack

回答

18

我已经懂了工作使用下面的方法:

@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) 
    } 
} 

不过,我不能确定这是否是去这样做的最佳方式。我还收到一个“常量‘浅’推断有anyobject”错误 - 所以,如果有对任何解决方案的话,那就太好

编辑

通过改变BAS修正:AnyObject

+1

我有这个错误'不可变的值类型'[NSManagedObject]'只有变异成员名为'removeAll'',不能使用removeall在这里? – TomSawyer

+0

我相信这行是不需要的,因为我的代码在没有它的情况下按预期运行。 @TomSawyer – MortalMan

42

试试这个简单的解决方案:

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)") 
    } 
} 

实施:

self.deleteAllData("your_entityName") 
+0

@SVMrajech,请分享此功能为快速1.2 –

+0

@SVMRAJESH,AppDelegte必须更改为AppDelegate – moonvader

+0

@moonvader谢谢 – svmrajesh

0

以上,但与AppDelegte呼叫类似取出UIView的变量使用

var context: NSManagedObjectContext? 
//deleting Message 

func deleteMessages(entity: String) { 
    do { 
     let request = NSFetchRequest(entityName: entity) 
     print(request) 

     if let result = try context!.executeFetchRequest(request) as? [your class of NSManagedObject] { 
      for message in result { 
      context!.deleteObject(message) 
      try context!.save() 
      print(message) 
      self.tableView.reloadData() 
      } 
     } 
    } catch { 
     print("miss") 
    } 
} 

使用呼叫功能

self.deleteMessages("TimeMaster") 
15

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

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

我用Swift3

func deleteAllCD(){ 
    for entityName in ["EntityName", "AnotherEntityName"]{ 
     let request = NSFetchRequest<NSFetchRequestResult>(entityName: entityName) 
     let delAllReqVar = NSBatchDeleteRequest(fetchRequest: request) 
     do { try persistentContainer.viewContext.execute(delAllReqVar) } 
     catch { print(error) } 
    } 
} 
0

斯威夫特3

// Replace 'MyEntityName' with your managed object class. 
let moc = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
let fetchRequest: NSFetchRequest<MyEntityName> = MyEntityName.fetchRequest() 
fetchRequest.returnsObjectsAsFaults = false 
moc.perform { 
    do { 
     let myEntities = try fetchRequest.execute() 
     for myEntity in myEntities { 
      moc.delete(myEntity) 
     } 
     try moc.save() 
    } catch let error { 
     print("Delete Error: \(error.localizedDescription)") 
    } 
} 
2

这个干净()方法,这一个删除所有的核心数据实体将获取从DataModel中的实体名单,并清除所有数据。

func deleteAll(entityName: String) -> Error? { 
      if #available(iOS 9.0, *) { 
       do { 
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName) 
        let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest) 
        try context.execute(batchDeleteRequest) 
       } catch { 
        return error 
       } 
       return nil 
      } else { 
       let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName) 
       fetchRequest.returnsObjectsAsFaults = false 
       do 
       { 
        let results = try context.fetch(fetchRequest) 
        for managedObject in results 
        { 
         if let managedObjectData:NSManagedObject = managedObject as? NSManagedObject { 
          context.delete(managedObjectData) 
         } 
        } 
       } catch { 
        return error 
       } 
       return nil 
      } 
     } 

     var objectModel: NSManagedObjectModel? { 
      if #available(iOS 10.0, *) { 
       return persistentContainer.managedObjectModel 
      } else { 
       return persistentStoreCoordinator?.managedObjectModel 
      } 
     } 

     open func clean() { 
      if let models = objectModel?.entities { 
       for entity in models { 
        if let entityName = entity.name { 
         _ = deleteAll(entityName: entityName) 
        } 
       } 
      } 
     } 

快乐编码!

+2

欢迎来到堆栈溢出!仅有代码的答案不是很有帮助。请编辑您的答案,以解释为什么您的代码可以解决原始问题。 –

9

对于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) 
    } 
} 
0

尝试这种情况:

func deleteAllData(entity: String) 
{ 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    let context = appDelegate.persistentContainer.viewContext 
    let ReqVar = NSFetchRequest(entityName: entity) 
    let DelAllReqVar = NSBatchDeleteRequest(fetchRequest: ReqVar) 
    do { try ContxtVar.executeRequest(DelAllReqVar) } 
    catch { print(error) } 
} 
1

的替代可以是完全去除并重新创建持久存储(iOS的10+,迅速3)。

let urls = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask); 
    var dbUrl = urls[urls.count-1]; 
    dbUrl = dbUrl.appendingPathComponent("Application Support/nameOfYourCoredataFile.sqlite") 
    do { 
     try persistentContainer.persistentStoreCoordinator.destroyPersistentStore(at: dbUrl, ofType: NSSQLiteStoreType, options: nil); 
    } catch { 
     print(error); 
    } 
    do { 
     try persistentContainer.persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: dbUrl, options: nil); 
    } catch { 
     print(error); 
    } 
1

还有据我了解两个简单的方法,首先

方法1:

提取,删除,重复

//初始化获取请求

let fetchRequest = NSFetchRequest(entityName: "Item") 

// Configure Fetch Request

fetchRequest.includesPropertyValues = false 

do { 

let items = try managedObjectContext.executeFetchRequest(fetchRequest) as! [NSManagedObject] 

for item in items { 
    managedObjectContext.deleteObject(item) 
} 

// Save Changes 
try managedObjectContext.save() 

} catch { 
// Error Handling 
// ... 

}

了Methode 2:

批量删除请求

//创建获取请求

let fetchRequest = NSFetchRequest(entityName: "Item") 

//创建批量删除请求

 let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest) 
     do { 
      try managedObjectContext.executeRequest(batchDeleteRequest) 

      } catch { 
// Error Handling 
    } 

我已经测试了和他们都工作正常

0

这是我的实现,基于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") 
    } 
} 
2

在雨燕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") 
     } 
    } 
0

你可以尝试这样的事情适用于iOS 9.0或更高版本,迅速3+:

public func clearDatabase() 
    { 
     let url = persistentContainer.persistentStoreDescriptions.first?.url 

     guard url != nil 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 let error { 
      print(name.uppercased() + ": Clear store: " + error.localizedDescription) 
     } 
    } 
的[删除/重置所有条目