アプリを閉じても Core Data に保存される(永続化)
Xcode で新しいプロジェクトを作るときに
「Use Core Data」にチェックを入れます ☑️
これで自動的に以下が追加されます:
YourAppName.xcdatamodeld(データモデル)
Persistence.swift
ステップ 2:データモデルを定義
YourAppName.xcdatamodeld を開いて「+」を押し、
新しい Entity を作成します:
Entity 名:Memo
Attribute:
text(String)
timestamp(Date)
import SwiftUI
import CoreData
struct ContentView: View {
// Core Data の管理オブジェクトコンテキスト
@Environment(\.managedObjectContext) private var viewContext
// 保存済みメモを取得して監視
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Memo.timestamp, ascending: false)],
animation: .default)
private var memos: FetchedResults<Memo>
@State private var newMemo: String = ""
var body: some View {
NavigationView {
VStack(spacing: 20) {
// メモ入力欄
TextField("メモを入力", text: $newMemo)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding(.horizontal)
// 保存ボタン
Button(action: addMemo) {
Label("保存", systemImage: "square.and.arrow.down")
}
.buttonStyle(.borderedProminent)
Divider()
// メモ一覧
List {
ForEach(memos) { memo in
VStack(alignment: .leading, spacing: 4) {
Text(memo.text ?? "")
.font(.headline)
if let date = memo.timestamp {
Text(date, style: .date)
.font(.caption)
.foregroundColor(.gray)
}
}
}
.onDelete(perform: deleteMemos)
}
.listStyle(.inset)
Spacer()
}
.navigationTitle("メモ帳")
.toolbar {
EditButton()
}
}
}
// MARK: - Core Data 操作
/// メモを追加
private func addMemo() {
guard !newMemo.isEmpty else { return }
let memo = Memo(context: viewContext)
memo.text = newMemo
memo.timestamp = Date()
do {
try viewContext.save()
newMemo = ""
} catch {
print("💥 保存エラー: \(error.localizedDescription)")
}
}
/// メモを削除
private func deleteMemos(at offsets: IndexSet) {
for index in offsets {
let memo = memos[index]
viewContext.delete(memo)
}
do {
try viewContext.save()
} catch {
print("💥 削除エラー: \(error.localizedDescription)")
}
}
}
// MARK: - プレビュー用
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
// プレビューでも Core Data のコンテキストを注入
let context = PersistenceController.preview.container.viewContext
ContentView()
.environment(\.managedObjectContext, context)
}
}
CoreDataの概念はわかったが、ソースの実行がうまくいかん..