現在、SwiftUIを使ったアプリ開発の練習として簡単なTodoアプリを作っているのだが、タスクのカテゴリ管理をCoreDataを使っておこなおうとしている。
全ての新規タスクは、特に指定がなければ「未分類」カテゴリに登録させようとしているのだが、この「未分類」カテゴリをCoreDataの初期データとして持たせておきたい。
今回はアプリの起動時、CoreDataのCategoryエンティティに何もデータが登録されていなければ初期データとして「未分類」カテゴリを持たせる方法を紹介する。
コード全文
まず、今回作ったコード全文を載せておく。
import SwiftUI
import CoreData
struct ContentView: View {
@Environment(\.managedObjectContext) var context
@FetchRequest(
entity: Category.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \Category.date, ascending: false)],
animation: .default
) var categorys: FetchedResults<Category>
func loadData() {
if self.categorys.count == 0 {
let category = Category(context: self.context)
category.name = "未分類"
category.date = Date()
do {
try context.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
}
var body: some View {
TabView {
TaskListView()
.tabItem { Text("Task") }
CategoryListView()
.tabItem { Text("Category") }
}
.onAppear(perform: loadData)
}
}
はじめに5〜10行目まで、現在のCategoryエンティティを取得してくる。
12行目のloadData関数では、取得してきたエンティティに何もデータが登録されていなければ、初期データを登録する処理をおこなっている。
あとはこのloadData関数を34行目、onAppearの引数に渡せばOK。
これでアプリの初回起動時に、CoreDataに初期データが登録されるようになる。