Migrate from Core Data to SwiftData
- Replace Core Data with SwiftData for iOS 18+ - Create MoodEntryModel as @Model class replacing MoodEntry entity - Create SharedModelContainer for App Group container sharing - Create DataController with CRUD extensions replacing PersistenceController - Update all views and view models to use MoodEntryModel - Update widget extension to use SwiftData - Remove old Core Data files (Persistence*.swift, .xcdatamodeld) - Add EntryType enum with all entry type cases - Fix widget label truncation with proper spacing and text scaling 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
93
Shared/Persisence/DataControllerHelper.swift
Normal file
93
Shared/Persisence/DataControllerHelper.swift
Normal file
@@ -0,0 +1,93 @@
|
||||
//
|
||||
// DataControllerHelper.swift
|
||||
// Feels
|
||||
//
|
||||
// SwiftData helper and test data operations.
|
||||
//
|
||||
|
||||
import SwiftData
|
||||
import Foundation
|
||||
|
||||
extension DataController {
|
||||
func randomEntries(count: Int) -> [MoodEntryModel] {
|
||||
var entries = [MoodEntryModel]()
|
||||
|
||||
for idx in 0..<count {
|
||||
let date = Calendar.current.date(byAdding: .day, value: -idx, to: Date())!
|
||||
let entry = MoodEntryModel(
|
||||
forDate: date,
|
||||
mood: Mood.allValues.randomElement()!,
|
||||
entryType: .listView
|
||||
)
|
||||
entry.timestamp = date
|
||||
entries.append(entry)
|
||||
}
|
||||
return entries
|
||||
}
|
||||
|
||||
func populateMemory() {
|
||||
#if DEBUG
|
||||
for idx in 1..<255 {
|
||||
let date = Calendar.current.date(byAdding: .day, value: -idx, to: Date())!
|
||||
var moodValue = Int.random(in: 2...4)
|
||||
if idx % 5 == 0 {
|
||||
moodValue = Int.random(in: 0...4)
|
||||
}
|
||||
|
||||
let entry = MoodEntryModel(
|
||||
forDate: date,
|
||||
mood: Mood(rawValue: moodValue) ?? .average,
|
||||
entryType: .listView
|
||||
)
|
||||
entry.timestamp = date
|
||||
modelContext.insert(entry)
|
||||
}
|
||||
save()
|
||||
#endif
|
||||
}
|
||||
|
||||
/// Creates an entry that is NOT inserted into the context - used for UI placeholders
|
||||
func generateObjectNotInArray(forDate date: Date = Date(), withMood mood: Mood = .placeholder) -> MoodEntryModel {
|
||||
var moodValue = Int.random(in: 2...4)
|
||||
if Int.random(in: 0...400) % 5 == 0 {
|
||||
moodValue = Int.random(in: 0...4)
|
||||
}
|
||||
|
||||
let entry = MoodEntryModel(
|
||||
forDate: date,
|
||||
moodValue: moodValue,
|
||||
entryType: EntryType.listView.rawValue,
|
||||
canEdit: false,
|
||||
canDelete: false
|
||||
)
|
||||
return entry
|
||||
}
|
||||
|
||||
func populateTestData() {
|
||||
clearDB()
|
||||
|
||||
for idx in 1..<1000 {
|
||||
let date = Calendar.current.date(byAdding: .day, value: -idx, to: Date())!
|
||||
var moodValue = Int.random(in: 3...4)
|
||||
if Int.random(in: 0...400) % 5 == 0 {
|
||||
moodValue = Int.random(in: 0...4)
|
||||
}
|
||||
|
||||
let entry = MoodEntryModel(
|
||||
forDate: date,
|
||||
mood: Mood(rawValue: moodValue) ?? .average,
|
||||
entryType: .listView
|
||||
)
|
||||
modelContext.insert(entry)
|
||||
}
|
||||
|
||||
saveAndRunDataListeners()
|
||||
}
|
||||
|
||||
func longestStreak() -> [MoodEntryModel] {
|
||||
let descriptor = FetchDescriptor<MoodEntryModel>(
|
||||
sortBy: [SortDescriptor(\.forDate, order: .forward)]
|
||||
)
|
||||
return (try? modelContext.fetch(descriptor)) ?? []
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user