現在、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に初期データが登録されるようになる。