データを取り出す(CoreData 手習い#3)

CoreData

はじめに

CoreData千里の道3歩目です。

調べればたくさん情報は得られますが、手を動かすのが大切なんだと思うのです。また、コードの書き方はそれぞれだと思うので、状況に応じて臨機応変な対応をお願いします。

欲しいデータを管理しているコンテキストを取得する

まず、NSFetchRequestクラスのインスタンスを生成します。

func fetchData()
{
    let entityName = "WorkerEntity"
    let workersFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
}

次にコンテキスト(NSManagedObjectContext)を取得します。これはAppDelegate.swiftから取得できます。

func fetchData()
{
    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)
}

nilが来ると後が続かなくなるので、現れた時点で仕事を切り上げます。

データのリクエストを用意する

NSFetchRequestクラスのインスタンスにパラメータを設定します。検索条件や取得制限数、ソート順などです。

出勤している人をリクエストします。

func fetchData()
{
    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 = 'true'")
    workersFetch.predicate = predicate
}

他に設定できるパラメータは何かな?
NSFetchRequestで使えるメソッド群をジャっと見てわかりやすいものを見つけてみました。他にも気になるものがありますが、追々ということで。

// 取得数を制限する
// 3件だけ持ってくる例
workersFetch.fetchLimit = 3
// ソートする
// Attributeのnameで逆順ソートする例
var sorts:[NSSortDescriptor] = []
sorts.append(NSSortDescriptor(key: "name", ascending: true))
workersFetch.sortDescriptors = sorts

いよいよデータの取得

取得したデータを保存するプロパティを用意します。何が来てもいいように、AnyObject型で用意します。きちんと型は決めましょう!

型推論がありますが、型を決めておいたほうが良いパターンの見分けができるようになりたい。

@State var array:[String] = ["りんご", "みかん", "バナナ", "メロン", "ぶどう", "かき", "いちご"]

適当に果物が並んでいますが、データベースからデータを取得したら中身が書き換わるはずです。

コンテキストに対してリクエストを渡します。

do {
    let workers = try context.fetch(workersFetch) as! [WorkerEntity]
    self.array.removeAll()
    for worker in workers {
        self.array.append(worker.name ?? "")
    }
    print("Fetched Data:" + self.array.count.description)
} catch let error as NSError {
    print(error)
}

寄り道:エンティティでOptionalのチェックを外したのに……

self.array.append(worker.name ?? "")

nilのときの対応を書かないといけません。エンティティを作ったときに「nilは無いよ」と指定しているので強制アンラップでも良いかもしれません。

もしかしたら、勘違いしているかも……(一抹の不安)

試してみる!

ワクワクですね。

ぜろけん

ですよね(´・ω・`)

空っぽが返ってきました。データが無いので当然です。もしくは何か間違えている可能性があります。

ただデータがそもそもないので、データが無いからか、間違えているのかはこの時点では不明となります。

本日はここまで

次の一歩はデータの書き込みです。
読み込み(`・ω・´)と、もやもや解消してみます。

次を書きました