Core Dataスタック:NSPersistentContainerの設定
SwiftUIアプリで永続コンテナ、コンテキスト、コーディネーターを設定します。
「Core Dataスタック:NSPersistentContainerの設定」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
Core Dataの概要
Core Dataは、Appleが提供するオブジェクトグラフおよび永続化フレームワークです。オブジェクト指向APIを使用して、SQLiteなどのストアを管理します。
import CoreData
// Key classes: NSPersistentContainer, NSManagedObjectContext
// NSManagedObject, NSFetchRequestNSPersistentContainerの作成
.xcdatamodeldモデルの名前を指定してNSPersistentContainerを初期化し、永続ストアを読み込みます。
let container = NSPersistentContainer(name: "MyModel")
container.loadPersistentStores { desc, error in
if let error { fatalError("Core Data failed: \(error)") }
}Persistence Controllerパターン
コンテナをシングルトン(または依存性注入可能な)PersistenceController構造体でラップし、アプリ全体からクリーンにアクセスできるようにします。
struct PersistenceController {
static let shared = PersistenceController()
let container: NSPersistentContainer
init() {
container = NSPersistentContainer(name: "MyModel")
container.loadPersistentStores { _, error in
if let error { fatalError("\(error)") }
}
}
}viewContextとbackgroundContext
viewContextはUIで使用するメインスレッドのコンテキストです。負荷の高い処理にはnewBackgroundContext()を使用します。
let viewCtx = PersistenceController.shared.container.viewContext
let bgCtx = PersistenceController.shared.container.newBackgroundContext()管理対象オブジェクトの作成
NSEntityDescription.insertNewObjectまたは生成されたクラスのイニシャライザを使用して、新しいオブジェクトを挿入します。
let item = Item(context: viewCtx)
item.timestamp = Date()
try? viewCtx.save()オブジェクトのフェッチ
NSFetchRequestを使用して、述語とソート記述子を指定しながらCore Dataのオブジェクトを検索します。
let request: NSFetchRequest<Item> = Item.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: false)]
let items = try? viewCtx.fetch(request)コンテキストの保存
変更を永続化するには、必ずcontext.save()を呼び出します。本番コードではdo-catchで囲みます。
do {
try viewCtx.save()
} catch {
print("Save failed: \(error)")
viewCtx.rollback()
}@FetchRequestによるSwiftUIとの統合
SwiftUIビューで@FetchRequestを使用すると、Core Dataの変更時にUIが自動的に更新されます。
struct ItemList: View {
@FetchRequest(
sortDescriptors: [SortDescriptor(\Item.timestamp, order: .reverse)]
) var items: FetchedResults<Item>
var body: some View {
List(items) { Text($0.timestamp!.formatted()) }
}
}viewContextのSwiftUIへの注入
viewContextをSwiftUIの環境経由で渡し、ビューからCore Dataを読み書きできるようにします。
@main
struct MyApp: App {
let persistence = PersistenceController.shared
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.managedObjectContext, persistence.container.viewContext)
}
}
}オブジェクトの削除
context.delete(object)を呼び出してから保存し、オブジェクトを完全に削除します。
viewCtx.delete(item)
try? viewCtx.save()テスト用のインメモリストア
ユニットテスト中にディスクへアクセスしないよう、インメモリストアを使用します。
let desc = NSPersistentStoreDescription()
desc.type = NSInMemoryStoreType
container.persistentStoreDescriptions = [desc]
container.loadPersistentStores { _, _ in }確認問題
UI主導のCore Dataの読み書きには、どのNSPersistentContainerコンテキストを使用すべきですか?
レッスンのまとめ
NSPersistentContainerでCore Dataを設定してストアを読み込み、PersistenceControllerでラップします。メインスレッドではviewContextを、負荷の高い処理にはnewBackgroundContext()を使用します。@FetchRequestと管理対象オブジェクトコンテキストの環境キーを使ってSwiftUIと統合します。
よくある質問
「Core Dataスタック:NSPersistentContainerの設定」レッスンは無料ですか?
はい。「Core Dataスタック:NSPersistentContainerの設定」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「Core Dataスタック:NSPersistentContainerの設定」で何を学びますか?
SwiftUIアプリで永続コンテナ、コンテキスト、コーディネーターを設定します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Core Dataスタック:NSPersistentContainerの設定」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Core Dataスタック:NSPersistentContainerの設定
- SwiftDataの@ModelとModelContext
- リレーションシップとFetch Descriptor
- 軽量マイグレーションとCloudKit同期