2016-10-07 22 views
20

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

私は、iOS 9または10にAppleが一括削除を行う方法を紹介しましたが、私はそれについて何か良い情報を見つけるように見えることができないことをどこかで読みました。

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

どのような考えですか?

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

しかしこれは動作していないよう:

編集は私がボタンに付加IBActionに次のコードを追加しました。プロジェクトを閉じてもう一度開くと、データはそのまま残ります。私は、データが実際に削除されていないので、これもテーブルビューが更新されない理由と仮定しています。

答えて

31

あなたはこのようなものを作成してiOSの9で追加されましたNSBatchDeleteRequest、考えている:あなたが唯一の述語に一致するインスタンスを削除したい場合

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

はまた、述語を追加することができます。リクエストを実行するには:

let result = try managedObjectContext.executeRequest(request) 

バッチリクエストは現在のアプリ状態を更新しません。削除の影響を受けるメモリ内のオブジェクトを管理している場合は、直ちにそのオブジェクトの使用を停止する必要があります。トムの返事を肉付けする

+0

私が使用したコードを表示するために私のポストを編集した - しかし、それは私のために動作していないようでした。基本的に私は、私のビューコントローラにロードされたUITableViewを持っており、 "PLProjects"と呼ばれるエンティティのすべての "プロジェクト"を表示しています。また、IBActionが関連付けられた画面上にボタンインスタンスがあります。私のコメントの更新は、IBActionのコードを示しています。これは、Core Data Entityからアイテムを削除することができず、テーブルを更新できませんでした。 –

+0

リクエストを作成するだけでは不十分です。あなたもそれを実行する必要があります。リクエストは自動的に実行されず、実行するように指示されたときに実行されます。 –

+0

ああ、ごめんなさい。私は最初に投稿したことを誤解しました。私はコードの2番目のスニペットが述語を追加することだと考えました。だから - そこにある2番目のスニペットでは、 "moc"は何ですか? –

19

、これは私が完全なルーチンを持っているために追加するものです。

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

コンテキストを宣言するために代理変数を使用しないでください。 – MrAn3

関連する問題