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:
Trey t
2025-12-10 15:08:05 -06:00
parent 443f4dfc55
commit aaaf04f05e
51 changed files with 926 additions and 962 deletions

View File

@@ -119,20 +119,14 @@ struct SettingsView: View {
if columns.count != 7 {
continue
}
let moodEntry = MoodEntry(context: PersistenceController.shared.viewContext)
moodEntry.canDelete = Bool(columns[0])!
moodEntry.canEdit = Bool(columns[1])!
moodEntry.entryType = Int16(columns[2])!
moodEntry.forDate = dateFormatter.date(from: columns[3])!
moodEntry.moodValue = Int16(columns[4])!
moodEntry.timestamp = dateFormatter.date(from: columns[5])!
let localTime = dateFormatter.date(from: columns[3])!
moodEntry.weekDay = Int16(Calendar.current.component(.weekday, from: localTime))
// let _ = print("import info: ", columns[3], dateFormatter.date(from: columns[3]), localTime, Int16(Calendar.current.component(.weekday, from: localTime)))
try! PersistenceController.shared.viewContext.save()
let forDate = dateFormatter.date(from: columns[3])!
let moodValue = Int(columns[4])!
let mood = Mood(rawValue: moodValue) ?? .missing
let entryType = EntryType(rawValue: Int(columns[2])!) ?? .listView
DataController.shared.add(mood: mood, forDate: forDate, entryType: entryType)
}
PersistenceController.shared.saveAndRunDataListerners()
DataController.shared.saveAndRunDataListeners()
EventLogger.log(event: "import_file")
} else {
EventLogger.log(event: "error_import_file")
@@ -201,7 +195,7 @@ struct SettingsView: View {
ZStack {
theme.currentTheme.secondaryBGColor
Button(action: {
PersistenceController.shared.populateTestData()
DataController.shared.populateTestData()
}, label: {
Text("Add test data")
.foregroundColor(textColor)
@@ -257,7 +251,7 @@ struct SettingsView: View {
ZStack {
theme.currentTheme.secondaryBGColor
Button(action: {
PersistenceController.shared.clearDB()
DataController.shared.clearDB()
}, label: {
Text("Clear DB")
.foregroundColor(textColor)
@@ -267,12 +261,12 @@ struct SettingsView: View {
.fixedSize(horizontal: false, vertical: true)
.cornerRadius(Constants.viewsCornerRaidus, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight])
}
private var fixWeekday: some View {
ZStack {
theme.currentTheme.secondaryBGColor
Button(action: {
PersistenceController.shared.fixWrongWeekdays()
DataController.shared.fixWrongWeekdays()
}, label: {
Text("Fix Weekday")
.foregroundColor(textColor)
@@ -576,28 +570,28 @@ struct SettingsView: View {
struct TextFile: FileDocument {
// tell the system we support only plain text
static var readableContentTypes = [UTType.plainText]
// by default our document is empty
var text = ""
// a simple initializer that creates new, empty documents
@MainActor
init() {
let entries = PersistenceController.shared.getData(startDate: Date(timeIntervalSince1970: 0),
endDate: Date(),
includedDays: [])
let entries = DataController.shared.getData(startDate: Date(timeIntervalSince1970: 0),
endDate: Date(),
includedDays: [])
var csvString = "canDelete,canEdit,entryType,forDate,moodValue,timestamp,weekDay\n"
for entry in entries {
let canDelete = entry.canDelete
let canEdit = entry.canEdit
let entryType = entry.entryType
let forDate = entry.forDate!
let forDate = entry.forDate
let moodValue = entry.moodValue
let timestamp = entry.timestamp!
let timestamp = entry.timestamp
let weekDay = entry.weekDay
let dataString = "\(canDelete),\(canEdit),\(entryType),\(String(describing: forDate)),\(moodValue),\(String(describing:timestamp)),\(weekDay)\n"
// print("DATA: \(dataString)")
csvString = csvString.appending(dataString)
}
text = csvString