LoginSignup
4
4

More than 1 year has passed since last update.

【SwiftUI】CoreDataを使う

Posted at

はじめに

以前、「コードのみでCoreDataを実装する」を書きました。
しかし、それ以来CoreDataを使ったことがありませんでした。
先日使うことがあったので使い方を記録しておきます。

サンプルアプリ

Simulator Screen Recording - iPhone 14 Pro - 2023-01-29 at 19 14 48

実装

xcdatamodeldを作成

① メインターゲットフォルダを右クリックします
② 「New File...」を選択します
スクリーンショット 2023-01-29 15 36 14

Dataを検索します
④ 「Data Model」を選択します
⑤ 「Next」を選択します
スクリーンショット 2023-01-29 15 48 11

⑥ 任意のファイル名を設定します
⑦ 「Create」を選択します
スクリーンショット 2023-01-29 15 50 49

Entityの設定

① 先ほど作成したファイルを選択します
② 「Add Entity」を選択します
スクリーンショット 2023-01-29 15 54 48

③ 追加したEntityを任意の名前にリネームします
スクリーンショット 2023-01-29 15 56 36

④ 「+」を選択します
⑤ Attribute名を決めます
⑥ Typeを選択します
スクリーンショット 2023-01-29 15 58 39

⑦ 追加したEntityを選択します
⑧ 三本線を選択します
⑨ 「Codegen」を選択します。
スクリーンショット 2023-01-29 18 17 46

⑩ 「Codegen」を「Manual/None」に変更します
スクリーンショット 2023-01-29 18 20 04

拡張を追加

① 「Editor」を選択します
② 「Create NSManagedObject Subclass...」を選択します
スクリーンショット 2023-01-29 16 04 00

③ 「Next」を選択します
スクリーンショット 2023-01-29 16 07 08

④ 「Next」を選択します
スクリーンショット 2023-01-29 16 08 29

⑤ フォルダを選択します
⑥ 「Create」を選択します
スクリーンショット 2023-01-29 16 10 05

⑦ ターゲットフォルダ内に移動させます。
スクリーンショット 2023-01-29 16 12 08

Persistenceを作成する

① メインターゲットフォルダを右クリックします
② 「New File...」を選択します
スクリーンショット 2023-01-29 18 08 03

③ 「Swift File」を選択します
④ 「Next」を選択します
スクリーンショット 2023-01-29 18 11 01

Persistenceというファイル名にします(自動生成時のファイル名がこれだった)
⑥ 「Create」を選択します
スクリーンショット 2023-01-29 18 13 16

作成したファイルに以下のコードをコピペします

Persistence
import CoreData

struct PersistenceController {
    static let shared = PersistenceController()

    static var preview: PersistenceController = {
        let result = PersistenceController(inMemory: true)
        let viewContext = result.container.viewContext
        // MARK: 下2行はEntityの設定によって違う
        let newSampleModel = SampleModel(context: viewContext)
        newSampleModel.title = ""
        do {
            try viewContext.save()
        } catch {
            let nsError = error as NSError
            fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
        }
        return result
    }()

    let container: NSPersistentContainer

    init(inMemory: Bool = false) {
        // MARK: 下1行はEntityの設定によって違う
        container = NSPersistentContainer(name: "SampleModel")
        if inMemory {
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
        }
        container.loadPersistentStores(completionHandler: { _, error in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        container.viewContext.automaticallyMergesChangesFromParent = true
    }
}

App.swiftの編集

import SwiftUI

@main
struct coredata_sampleApp: App {
    private let persistence = PersistenceController.shared
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistence.container.viewContext)
        }
    }
}

サンプルアプリ

アプリを起動した時間をCoreDataに保存するアプリです。

import SwiftUI

struct ContentView: View {
    // MARK: `SampleModel`は各自の設定によって違います
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \SampleModel.title, ascending: false)],
        animation: .default
    )
    private var samples: FetchedResults<SampleModel>

    // MARK: 追加/削除に必要
    @Environment(\.managedObjectContext) private var context

    var body: some View {
        List(samples) { sample in
            Text(sample.title ?? "")
        }
        .onAppear {
            // MARK: ここが追加の処理
            let newSampleModel = SampleModel(context: context)
            newSampleModel.title = "\(Date.now.timeIntervalSince1970)"

            try? context.save()
        }
    }
}

おわり

無事、CoreDataを使用することができました!

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4