web-dev-qa-db-ja.com

Swift 3のコアデータエンティティのすべてのデータを削除する

コアデータのすべてのエンティティに保存されているすべてのデータを一括削除する方法はありますか?

IOS 9または10でApple=はバッチ削除を行う方法を導入しましたが、それに関する良い情報を見つけることができないようです。

最終的には、エンティティを通過し、その中のすべてのデータを削除する関数が必要です。それは十分にシンプルであるように思えますが、それに関するドキュメント/チュートリアルは見つけるのが非常に難しいと証明されました。

何かご意見は?

編集

ボタンに接続された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()
}

ただし、これは機能しないようです。プロジェクトを閉じて再度開くと、データはまだそこにあります。データが実際に削除されていないため、これがTable Viewが更新されない理由でもあると考えています。

33
John Hubler

IOS 9で追加されたNSBatchDeleteRequestを考えています。次のようなものを作成します。

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

述語に一致するインスタンスのみを削除する場合は、述語を追加することもできます。リクエストを実行するには:

let result = try managedObjectContext.executeRequest(request)

バッチリクエストは、現在のアプリの状態を更新しないことに注意してください。削除の影響を受けるメモリ内の管理オブジェクトがある場合、それらの使用をすぐに停止する必要があります。

56
Tom Harrington

トムの返信を具体化するために、これが完全なルーチンを作成するために追加したものです。

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

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