add ModelContainerPreview conecept, move SampleData, fix Exercise, ExerciseUnit, ExerciseType

This commit is contained in:
Felix Förtsch
2024-11-13 13:59:39 +01:00
parent 370e070fcd
commit 02e2937094
11 changed files with 211 additions and 63 deletions

View File

@@ -0,0 +1,84 @@
//
// SampleData.swift
// WorkoutsPlus
//
// Created by Felix Förtsch on 17.08.24.
//
import Foundation
import SwiftData
// This is taken from the Animals example
extension ModelContainer {
static var sample: () throws -> ModelContainer = {
let schema = WorkoutsPlusApp.swiftDataSchema
let configuration = ModelConfiguration(isStoredInMemoryOnly: true)
let container = try ModelContainer(for: schema, configurations: [configuration])
Task { @MainActor in
SampleData.insertSampleData(into: container.mainContext)
}
return container
}
}
@MainActor // With your annotation, youre declaring that all code in this class must run on the main actor, including access to the mainContext property. Since all the SwiftUI code in an app runs on the main actor by default, youve satisfied the condition.
class SampleData {
static let shared = SampleData()
let modelContainer: ModelContainer
var context: ModelContext {
modelContainer.mainContext
}
private init() {
let schema = WorkoutsPlusApp.swiftDataSchema
let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: true)
do {
modelContainer = try ModelContainer(for: schema, configurations: [modelConfiguration])
SampleData.insertSampleData(into: context)
} catch {
fatalError("Could not create ModelContainer: \(error)")
}
}
}
extension SampleData {
static func insertSampleData(into context: ModelContext) {
for exerciseType in ExerciseType.sampleData {
context.insert(exerciseType)
}
for exerciseUnit in ExerciseUnit.sampleData {
context.insert(exerciseUnit)
}
for exercise in Exercise.sampleDataRecommendedRoutine {
context.insert(exercise)
}
for exercise in Exercise.sampleDataRings {
context.insert(exercise)
}
for workoutItem in WorkoutItem.sampleDataRecommendedRoutine {
context.insert(workoutItem)
}
for workoutItem in WorkoutItem.sampleDataRings {
context.insert(workoutItem)
}
for workout in Workout.sampleData {
context.insert(workout)
}
do {
try context.save()
} catch {
print("Sample data context failed to save.")
}
}
}