データを削除する(CoreData 手習い#5)

データを削除するCoreData

はじめに

CoreData 手習いその5です。

コンテキストを取得する

コンテキストNSManagedObjectContextを取得します。もはやお決まりの定型句ですね。

func deleteData()
{
    let entityName = "WorkerEntity"
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        fatalError("nilがあらわれた")
    }
    let context = appDelegate.persistentContainer.viewContext
}

消したいデータを特定する

データを消すに当たって、どのデータを削除するか特定しないといけません。そこで、NSFetchRequestクラスのインスタンスにパラメータを設定します。

今回は出欠がfalseのデータがターゲットです。

func deleteData()
{
    let entityName = "WorkerEntity"
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        fatalError("nilがあらわれた")
    }
    let context = appDelegate.persistentContainer.viewContext
    let workersFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
    let predicate = NSPredicate(format: "onduty = false")
    workersFetch.predicate = predicate
}

データを削除する

ターゲットとなるデータが決定したら、まずデータを取得します。その後で、取得したデータを順次消していきます。

func deleteData()
{
    let entityName = "WorkerEntity"
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        fatalError("nilがあらわれた")
    }
    let context = appDelegate.persistentContainer.viewContext
    let workersFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
    let predicate = NSPredicate(format: "onduty = false")
    workersFetch.predicate = predicate
    do {
        let workers = try context.fetch(workersFetch) as! [WorkerEntity]
        for worker in workers {
            context.delete(worker)
        }
    } catch let error as NSError {
        print(error)
    }
    appDelegate.saveContext()
}

直接消していくのではなくて、取得してから一つずつ消すのか。
ということは、

func deleteData(_ dataSet:[WorkerEntity])
{
    let entityName = "WorkerEntity"
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        fatalError("nilがあらわれた")
    }
    let context = appDelegate.persistentContainer.viewContext
    do {
        for worker in workers {
            context.delete(worker)
        }
    } catch let error as NSError {
        print(error)
    }
    appDelegate.saveContext()
}

というのもアリということですね。型を[WorkerEntity]とか固定しているので不格好ですが:D

実際に消してみよう

  • データ書き込み
  • データの読み出し
  • データ削除
  • データの読み出し

の順で確認していきます。

データの書き込みは前回と同じ日本太郎、米国太郎、豪州太郎さんに登場いただきます。削除ターゲットはondutyfalseの日本太郎で、最終的に米国太郎、豪州太郎が残ることを期待します。今更ですが、日本/米国/豪州には特段深い意味はありませんよ。

データ削除できました!

いえ~い!!

タイトルとURLをコピーしました