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)
小智 23
您可以destroyPersistentStore从iOS 9.0和Swift 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)
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)
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)
这是我根据 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)
在 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)
斯威夫特 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)
希望这可以帮助
| 归档时间: |
|
| 查看次数: |
48492 次 |
| 最近记录: |