ER 図

erDiagram Subject ||--o{ StudySession : has UserSettings { Int dailyGoalMinutes Bool reminderEnabled Int reminderHour String goalType String schoolName Date examDate } Subject { UUID id String name String colorHex String iconName Int sortOrder Int currentScore Int targetScore } StudySession { UUID id Date startTime Date endTime TimeInterval duration }

StudySession

@Model final class StudySession {
    var id: UUID = UUID()
    var startTime: Date = Date()
    var endTime: Date?
    var duration: TimeInterval = 0
    var subject: Subject?

    var date: Date { Calendar.current.startOfDay(for: startTime) }
}

Subject

@Model final class Subject {
    var id: UUID = UUID()
    var name: String = ""
    var colorHex: String = "#007AFF"
    var iconName: String = "book"
    var sortOrder: Int = 0
    var createdAt: Date = Date()
    var currentScore: Int?
    var targetScore: Int?

    @Relationship(deleteRule: .cascade, inverse: \StudySession.subject)
    var sessions: [StudySession] = []
}

UserSettings

@Model final class UserSettings {
    var dailyGoalMinutes: Int? = nil
    var reminderEnabled: Bool = false
    var reminderHour: Int = 19
    var reminderMinute: Int = 0
    var goalType: String?  // "定期テスト" / "高校受験" / "大学受験"
    var schoolName: String?
    var motivation: String?
    var examDate: Date?
}

StudyActivityAttributes(Live Activity)

struct StudyActivityAttributes: ActivityAttributes {
    var subjectName: String
    var subjectColorHex: String
    var subjectIconName: String
    var startTime: Date

    struct ContentState: Codable {
        var elapsedSeconds: Int
        var subjectName: String
    }
}

UserDefaults キー(AppGroup)

AppGroup: group.com.happyboy1002.StudyStopwatch

キー用途
activeTimer_startTimeDateタイマー開始日時(永続化)
activeTimer_subjectIDString (UUID)タイマー科目ID
todayStudySecondsInt本日の学習時間(Widget用)
dailyGoalMinutesInt日次目標(Widget用)
schoolNameString志望校名
examDateDate試験日
streakDaysInt連続学習日数
themeAccentHexStringテーマカラー
onboardingCompletedBoolオンボーディング完了
appearanceModeString外観モード(system/light/dark)

Enum 一覧

マイグレーション方針

SwiftDataの@Modelは全プロパティにデフォルト値必須。新規プロパティ追加時は必ずデフォルト値を設定する。

変更履歴

バージョン日付変更内容
1.02026-05-09初版作成