【サンプルコードあり】SwiftUI×CoreDataでメモアプリを作ってみた#2 実装編

SwiftUI

はじめに

この記事は前回の続きとなります。

今回はまずアプリを作成しCoreDataを導入する部分まで行います。そして次回、SwiftUIを利用してメモアプリを実装していきます。

アプリ実装

プロジェクトの作成

それではまずプロジェクトの作成から行います。

Xcodeを開き「Create New Project」を選択し、プロジェクトを作成します。

上の画像のような画面になると思うので、「App」を選択し「Next」をクリックしてください。

今回作成するアプリがメモアプリなので「Product Name」に「Memo」と入れます。

そのほかの項目は、基本的に変更しなくて大丈夫かと思いますが、違ったら上記の画像のように設定してください。

次に「Next」を選択して次に進んでください。これでプロジェクトの作成は完了です。

CoreData利用の準備

ここからはCoreDataの利用のための準備を行います。まず、Model(NSManagedObjectModel)の作成を行ないそれを利用できるようにしてきます。以下の手順に従ってやってみてください。

Modelの作成

プロジェクト作成後上の画像のような画面に遷移すると思います。そしたら左の最上位階層の「Memo」を右クリックしてください。

「New File from Template…」をクリック

上の画像のような画面になると思うので、右上のFilterで「Data Model」と検索してください。

Data Modelがヒットするので「Data Model」を選択し、「Next」をクリックします。

上の画像のような画面が出てくるので「Save As:」を「MemoModel.xcdatamodel」に変更します。その後「Create」をクリックします。

このような画面が出てきた場合は、「Use .xcdatamodeld」を選択してください。

ここまでの流れで、Model(NSManagedObjectModel)の作成を行なっています。先ほど作成したMemoModel.xcdatamodelがNSManagedObjectModelになっています。

次に、Entity(NSEntityDesription)を作成していきます。

上の画像のような画面に遷移していると思います。画面下の「Add Entity」クリックしてください。

「Entity」が追加されるので、名前を「Memo」に変更します。

変更後MemoのAttributeの+マークをクリックし、Memo(Entiy)に要素を追加していきます。これはイメージとして、データベースに属性名を追加しているイメージです。

追加すると上記のようになります。追加したattributeの名前を「id」に変更します。こちらは属性名になります。

次にTypeを変更していきます。idのタイプは「UUID」を選択してください。

上記のようになれば属性追加完了です。さらに属性を追加していきます。以下の項目を追加してください。

追加項目

AttributeType
titleString
contentsString
upDateTimeString

追加後上の画像のようになればOKです!実際に追加した項目は以下のように利用します。

Attribute利用方法
idメモの識別番号
title題名
contentsメモ内容
upDateTime更新日時

ここまででModelの設定は完了です。イメージとしては、ここまででデータベースの作成が終了した形になります。次にこのCoreDataをソースコード上で利用するための設定を行なっていきます。

作成したModelをソースコードで利用するための準備

Memoフォルダで右クリックをしてください。

「New File from Template…」をクリック

テンプレート選択する画面が表示されるので、「Swift File」を選択肢「Next」」をクリック

「PersisitentController.swift」と名前を変更し、「Create」を選択してください。

上の画像のようにPersistentController.swiftファイルが作成されます。

その中に以下のコードを追記してください。

import Foundation
import CoreData

struct PersistenceController {
    let container: NSPersistentContainer
    
    init(){
        container = NSPersistentContainer(name: "MemoModel")
        
        container.loadPersistentStores { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unnresolved error: \(error)")
            }
        }
    }
}

このコードはCoreDataを利用するときのすべてのクラスの大元となるNSPersistentContainerを作るためのクラスになります。

let container: NSPersistentContainer

まずここでCoreDataを利用するのに必要な処理を行なってくれるNSPersistentContainerの変数を定義します。

 init(){...}

initメソッド内で初期化処理を行なっていきます。

 container = NSPersistentContainer(name: "MemoModel")

はじめに定義したcontainerにModelを紐づけます。今回はMemoModelとして作成したので、nameはMemoModelを指定します。

container.loadPersistentStores { (storeDescription, error) in
  if let error = error as NSError? {
      fatalError("Unnresolved error: \(error)")
  }
}

次に、実際のロード処理とエラーの処理を記載していきます。

次にMemoApp.swiftを開いて、作成したContainerをViewで利用できるように設定していきます。

MemoApp.swiftに移動し、以下のようにコードを変更してください。

import SwiftUI

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

変更点は、L5とL9です。

 let persistentController = PersistenceController()

L5では先ほど作ったPersistentControllerを利用するための処理を実行しています。

ContentView()
  .environment(\.managedObjectContext,persistentController.container.viewContext)

次にL9ですが、ContentViewインスタンスにenvironmentモディファイをつけ、ContenView以下の子ビューでL5で作成したpersistentConteroller内のcontainer.viewContextを利用できるようにしています。

ここまでで、CoreDataを利用するための準備が完了しました。次回は、実際の画面の作成に移っていきます!

続き

次の記事は以下からどうぞ!

【サンプルコードあり】SwiftUIとCoreDataでメモアプリを作ってみた#3 実装編

プロフィール

SIer勤めのエンジニア
アプリケーションエンジニアとして、WebやiOSなどのアプリ開発をメインにしてます

tomaをフォローする
SwiftUI