2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SwiftUIでCoreDataを使おう!

Posted at

SwiftUIでCoreDataの使い方を学んだので、忘れないためにメモします。少しでもCoreDataの使い方で苦労している人の助けになればいいと思います。

Fetch処理

// 1
@Environment(\.managedObjectContext) var managedObjectContext
// 2
@FetchRequest(
// 3
  entity: Sample.entity(),
  // 4
  sortDescriptors: [
    NSSortDescriptor(keyPath: \Sample.inPutNum, ascending: true)
  ]
  /*
    特定の情報を取得したい時だけ、述語を追加する

    ,predicate: NSPredicate(format: "genre contains 'Action'")

    これを追加すれば結果を制限することができる
  */
  // 5
) var samples: FetchedResults<Sample>
  1. managedObjectContext(管理オブジェクトが登録されているコンテキスト)にアクセスする宣言
  2. プロパティラッパーを使用してプロパティを宣言。これにより、結果を直接使用することができる
  3. CoreDataがfetchするEntityを指定。
  4. keyPathでEntityの属性でソートします。ここでデータを読み込み、成形しているため必須
  5. FetchedResults(フェッチ要求の実行結果)を継承する"samples"を宣言

データの追加

// 1
let newSample = Sample(context: self.managedObjectContext)
// 2
newSample.inPutNum = self.keyPut
// 3                    
let appDelegate:AppDelegate  = UIApplication.shared.delegate as! AppDelegate
// 4
appDelegate.saveContext()
  1. 新しいオブジェクトコンテキストを作成
  2. パラメーターとして渡されるプロパティの設定
  3. AppDelegateを継承する
  4. 管理オブジェクトコンテキストを保存する

勝手にAppDelegate.swiftに追加されるメソッド達

プロジェクト作成時、CoreDataの項目を選択すると自動で2つのメソッドが追加されています。

CoreDataStackを設定するために必要なこと

AppDelegate.swift
// 1
lazy var persistentContainer: NSPersistentCloudKitContainer = {
  // 2
  let container = NSPersistentCloudKitContainer(name: "DemoCoreData")
  // 3
  container.loadPersistentStores(completionHandler: { (storeDescription, error) in
    if let error = error as NSError? {
      // 4
      fatalError("Unresolved error \(error), \(error.userInfo)")
    }
    })
  return container
}
  1. persistentContainerを呼び出すとNSPersistentContainerを継承したプロパティが作成
  2. コンテナを呼び出す
  3. containerに永続ストアをロード。これにより、CoreDataStackがセットアップされる
  4. エラーチェック

ディスクにデータを保存する方法

CoreDataは自動的に保存しないため、ディスクに保存する処理が必要です。

AppDelegate.swift
func saveContext () {
  // 1
  let context = persistentContainer.viewContext
  // 2
  if context.hasChanges {
    do {
      // 3
      try context.save()
    } catch {
      // 4
      let nserror = error as NSError
      fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
    }
  }
}
  1. viewContext(永続コンテナの管理対象オブジェクトのコンテキスト)を取得
  2. hasChanges(コンテキストに変更があるかをboolで返す)でデータに変更があった場合のみ保存
  3. 保存する
  4. エラー処理

ソースコード

コードをGitHubで公開しているので、参考にしてください。
https://github.com/r0227n/SwiftUI/tree/master/DemoCoreData

参考サイト

2
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
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?