アプリを終了してもデータを残すためのものです.
Contents 非表示
実装
DataModelの追加
Command + N
で新規ファイル追加画面を開き、DataModel
を選択する
CoreDataSample.xcdatamodeld
と名付けて、中身に新たなEntity
を加える
Persistence.swift
Persistence.swift
というファイルを追加、以下をそのままコピペ
import CoreData
// Core Data stackの作成、管理を行う.
struct PersistenceController {
// アプリ全体で使えるShared Instance.
static let shared = PersistenceController()
// プレビュー、テスト用
static var preview: PersistenceController = {
let result = PersistenceController(inMemory: true)
let viewContext = result.container.viewContext
// サンプルを10個 in-memoryストアに保存.
for _ in 0..<10 {
let newItem = Task(context: viewContext)
newItem.name = "Sample Task"
}
do {
// 変更を保存.
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
return result
}()
let container: NSPersistentContainer
init(inMemory: Bool = false) {
// コンテナの作成
container = NSPersistentContainer(name: "CoreDataSample")
if inMemory {
if let firstStoreDescription = container.persistentStoreDescriptions.first {
firstStoreDescription.url = URL(fileURLWithPath: "/dev/null")
} else {
fatalError("Unable to access persistent store description")
}
}
// ロード
container.loadPersistentStores { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
}
}
}
HomeView.swift (メインのView)
import SwiftUI
struct HomeView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(entity: Task.entity(), sortDescriptors: []) var tasks: FetchedResults<Task>
@State private var taskName = ""
var body: some View {
NavigationView {
List {
Section(header: Text("Add Task")) {
HStack {
TextField("Enter task name", text: $taskName)
Button(action: addTask) {
Text("Add")
}
}
}
Section(header: Text("Tasks")) {
ForEach(tasks, id: \.self) { task in
Text(task.name ?? "")
}
.onDelete(perform: deleteTasks)
}
}
.listStyle(GroupedListStyle())
.navigationTitle("Task List")
.navigationBarItems(trailing: EditButton())
}
}
private func addTask() {
withAnimation {
if !taskName.isEmpty {
let newTask = Task(context: viewContext)
newTask.name = taskName
taskName = ""
try? viewContext.save()
}
}
}
private func deleteTasks(offsets: IndexSet) {
withAnimation {
offsets.map { tasks[$0] }.forEach(viewContext.delete)
try? viewContext.save()
}
}
}
struct HomeView_Previews: PreviewProvider {
static var previews: some View {
HomeView()
.environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
}
}
アプリ名.swift
import SwiftUI
@main
struct SwiftUI_PlaygroundApp: App {
let persistenceController = PersistenceController.shared // 追加
var body: some Scene {
WindowGroup {
HomeView()
.environment(\.managedObjectContext, persistenceController.container.viewContext) // 追加
}
}
}