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>
- managedObjectContext(管理オブジェクトが登録されているコンテキスト)にアクセスする宣言
- プロパティラッパーを使用してプロパティを宣言。これにより、結果を直接使用することができる
- CoreDataがfetchするEntityを指定。
-
keyPath
でEntityの属性でソートします。ここでデータを読み込み、成形しているため必須 - 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()
- 新しいオブジェクトコンテキストを作成
- パラメーターとして渡されるプロパティの設定
- AppDelegateを継承する
- 管理オブジェクトコンテキストを保存する
勝手に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
}
- persistentContainerを呼び出すとNSPersistentContainerを継承したプロパティが作成
- コンテナを呼び出す
- containerに永続ストアをロード。これにより、CoreDataStackがセットアップされる
- エラーチェック
ディスクにデータを保存する方法
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)")
}
}
}
- viewContext(永続コンテナの管理対象オブジェクトのコンテキスト)を取得
- hasChanges(コンテキストに変更があるかをboolで返す)でデータに変更があった場合のみ保存
- 保存する
- エラー処理
ソースコード
コードをGitHubで公開しているので、参考にしてください。
https://github.com/r0227n/SwiftUI/tree/master/DemoCoreData
参考サイト