From cc10a82b818042cb4ef3e9b1c1aa075d7a5daf13 Mon Sep 17 00:00:00 2001 From: Jean-Charles Mourey Date: Fri, 5 Dec 2025 01:12:48 +0100 Subject: [PATCH 1/4] Bootstrap the database with a nil SyncEngineDelegate in RemindersList previews so lists will appear. And do not seed sample data to preserve the SeedSampleData UI. --- Examples/Reminders/RemindersApp.swift | 2 +- Examples/Reminders/RemindersLists.swift | 8 ++-- Examples/Reminders/Schema.swift | 62 +++++++++++++------------ Examples/RemindersTests/Internal.swift | 2 +- 4 files changed, 39 insertions(+), 35 deletions(-) diff --git a/Examples/Reminders/RemindersApp.swift b/Examples/Reminders/RemindersApp.swift index 93b7b845..b9c3eb88 100644 --- a/Examples/Reminders/RemindersApp.swift +++ b/Examples/Reminders/RemindersApp.swift @@ -18,7 +18,7 @@ struct RemindersApp: App { init() { if context == .live { try! prepareDependencies { - try $0.bootstrapDatabase(syncEngineDelegate: syncEngineDelegate) + try $0.bootstrapDatabase(syncEngineDelegate: syncEngineDelegate, seedSampleData: false) } } } diff --git a/Examples/Reminders/RemindersLists.swift b/Examples/Reminders/RemindersLists.swift index 971a8979..aba9e7d4 100644 --- a/Examples/Reminders/RemindersLists.swift +++ b/Examples/Reminders/RemindersLists.swift @@ -436,10 +436,12 @@ private struct ReminderGridCell: View { } #Preview { - let _ = try! prepareDependencies { - $0.defaultDatabase = try Reminders.appDatabase() + withErrorReporting { + try prepareDependencies { + try $0.bootstrapDatabase(seedSampleData: false) + } } - NavigationStack { + return NavigationStack { RemindersListsView(model: RemindersListsModel()) } } diff --git a/Examples/Reminders/Schema.swift b/Examples/Reminders/Schema.swift index 1abb5de6..f77fc4fb 100644 --- a/Examples/Reminders/Schema.swift +++ b/Examples/Reminders/Schema.swift @@ -116,8 +116,8 @@ struct ReminderText: FTS5 { } extension DependencyValues { - mutating func bootstrapDatabase(syncEngineDelegate: (any SyncEngineDelegate)? = nil) throws { - defaultDatabase = try Reminders.appDatabase() + mutating func bootstrapDatabase(syncEngineDelegate: (any SyncEngineDelegate)? = nil, seedSampleData: Bool) throws { + defaultDatabase = try Reminders.appDatabase(seedSampleData: seedSampleData) defaultSyncEngine = try SyncEngine( for: defaultDatabase, tables: RemindersList.self, @@ -130,7 +130,7 @@ extension DependencyValues { } } -func appDatabase() throws -> any DatabaseWriter { +func appDatabase(seedSampleData: Bool = true) throws -> any DatabaseWriter { @Dependency(\.context) var context var configuration = Configuration() configuration.foreignKeysEnabled = true @@ -138,15 +138,15 @@ func appDatabase() throws -> any DatabaseWriter { try db.attachMetadatabase() db.add(function: $createDefaultRemindersList) db.add(function: $handleReminderStatusUpdate) - #if DEBUG - db.trace(options: .profile) { - if context == .live { - logger.debug("\($0.expandedDescription)") - } else { - print("\($0.expandedDescription)") - } +#if DEBUG + db.trace(options: .profile) { + if context == .live { + logger.debug("\($0.expandedDescription)") + } else { + print("\($0.expandedDescription)") } - #endif + } +#endif } let database = try SQLiteData.defaultDatabase(configuration: configuration) logger.debug( @@ -156,9 +156,9 @@ func appDatabase() throws -> any DatabaseWriter { """ ) var migrator = DatabaseMigrator() - #if DEBUG - migrator.eraseDatabaseOnSchemaChange = true - #endif +#if DEBUG + migrator.eraseDatabaseOnSchemaChange = true +#endif migrator.registerMigration("Create initial tables") { db in let defaultListColor = Color.HexRepresentation(queryOutput: RemindersList.defaultColor).hexValue try #sql( @@ -228,7 +228,7 @@ func appDatabase() throws -> any DatabaseWriter { ) .execute(db) } - + migrator.registerMigration("Create foreign key indexes") { db in try #sql( """ @@ -254,9 +254,9 @@ func appDatabase() throws -> any DatabaseWriter { } try migrator.migrate(database) - + try database.write { db in - + try RemindersList.createTemporaryTrigger( after: .insert { new in RemindersList @@ -265,7 +265,7 @@ func appDatabase() throws -> any DatabaseWriter { } ) .execute(db) - + try Reminder.createTemporaryTrigger( after: .insert { new in Reminder @@ -274,7 +274,7 @@ func appDatabase() throws -> any DatabaseWriter { } ) .execute(db) - + try RemindersList.createTemporaryTrigger( after: .delete { _ in Values($createDefaultRemindersList()) @@ -283,7 +283,7 @@ func appDatabase() throws -> any DatabaseWriter { } ) .execute(db) - + try Reminder.createTemporaryTrigger( after: .insert { new in ReminderText.insert { @@ -297,7 +297,7 @@ func appDatabase() throws -> any DatabaseWriter { } ) .execute(db) - + try Reminder.createTemporaryTrigger( after: .update { ($0.title, $0.notes) @@ -311,7 +311,7 @@ func appDatabase() throws -> any DatabaseWriter { } ) .execute(db) - + try Reminder.createTemporaryTrigger( after: .delete { old in ReminderText @@ -320,7 +320,7 @@ func appDatabase() throws -> any DatabaseWriter { } ) .execute(db) - + func updateReminderTextTags( for reminderID: some QueryExpression ) -> UpdateOf { @@ -328,28 +328,28 @@ func appDatabase() throws -> any DatabaseWriter { .where { $0.rowid.eq(Reminder.find(reminderID).select(\.rowid)) } .update { $0.tags = - ReminderTag + ReminderTag .order(by: \.tagID) .where { $0.reminderID.eq(reminderID) } .join(Tag.all) { $0.tagID.eq($1.primaryKey) } .select { ("#" + $1.title).groupConcat(" ") ?? "" } } } - + try ReminderTag.createTemporaryTrigger( after: .insert { new in updateReminderTextTags(for: new.reminderID) } ) .execute(db) - + try ReminderTag.createTemporaryTrigger( after: .delete { old in updateReminderTextTags(for: old.reminderID) } ) .execute(db) - + try Reminder.createTemporaryTrigger( after: .update { $0.status @@ -360,12 +360,14 @@ func appDatabase() throws -> any DatabaseWriter { } ) .execute(db) - - if context != .live { + +#if DEBUG + if seedSampleData { try db.seedSampleData() } +#endif } - + return database } diff --git a/Examples/RemindersTests/Internal.swift b/Examples/RemindersTests/Internal.swift index b21916c3..ca6ce3f0 100644 --- a/Examples/RemindersTests/Internal.swift +++ b/Examples/RemindersTests/Internal.swift @@ -10,7 +10,7 @@ import Testing .dependency(\.continuousClock, ImmediateClock()), .dependency(\.date.now, Date(timeIntervalSince1970: 1_234_567_890)), .dependency(\.uuid, .incrementing), - .dependencies { try $0.bootstrapDatabase() }, + .dependencies { try $0.bootstrapDatabase(seedSampleData: true) }, .snapshots(record: .failed) ) struct BaseTestSuite {} From 6577e2a77478a4fbf8350aac726061545ffcdab2 Mon Sep 17 00:00:00 2001 From: Jean-Charles Mourey Date: Wed, 17 Dec 2025 19:13:13 +0100 Subject: [PATCH 2/4] Change to the PointFree founders' preference of seeding data from each preview as appropriate. Moved to lazy initializers in previews as needed to avoid unnecessary multiple re-creations of the database that sometimes lead to seeding conflicts. --- Examples/Reminders/ReminderForm.swift | 17 +- Examples/Reminders/ReminderRow.swift | 19 +- Examples/Reminders/RemindersApp.swift | 2 +- Examples/Reminders/RemindersDetail.swift | 9 +- Examples/Reminders/RemindersLists.swift | 22 ++- Examples/Reminders/Schema.swift | 238 +++++++++++------------ Examples/Reminders/TagsForm.swift | 1 + Examples/RemindersTests/Internal.swift | 3 +- 8 files changed, 164 insertions(+), 147 deletions(-) diff --git a/Examples/Reminders/ReminderForm.swift b/Examples/Reminders/ReminderForm.swift index a41e28e0..e4c00a21 100644 --- a/Examples/Reminders/ReminderForm.swift +++ b/Examples/Reminders/ReminderForm.swift @@ -204,17 +204,20 @@ extension Optional { } struct ReminderFormPreview: PreviewProvider { - static var previews: some View { - let (remindersList, reminder) = try! prepareDependencies { + private static var reminderDetail: (Reminder, RemindersList) = { + try! prepareDependencies { $0.defaultDatabase = try Reminders.appDatabase() - return try $0.defaultDatabase.write { db in + try $0.defaultDatabase.seed() + return try $0.defaultDatabase.read { db in let remindersList = try RemindersList.fetchOne(db)! - return ( - remindersList, - try Reminder.where { $0.remindersListID.eq(remindersList.id) }.fetchOne(db)! - ) + let reminder = try Reminder.where { $0.remindersListID.eq(remindersList.id) }.fetchOne(db)! + return (reminder, remindersList) } } + }() + + static var previews: some View { + let (reminder, remindersList) = reminderDetail NavigationStack { ReminderFormView(reminder: Reminder.Draft(reminder), remindersList: remindersList) .navigationTitle("Detail") diff --git a/Examples/Reminders/ReminderRow.swift b/Examples/Reminders/ReminderRow.swift index c112eaa3..fce780df 100644 --- a/Examples/Reminders/ReminderRow.swift +++ b/Examples/Reminders/ReminderRow.swift @@ -156,17 +156,20 @@ struct ReminderRow: View { } struct ReminderRowPreview: PreviewProvider { - static var previews: some View { - var reminder: Reminder! - var remindersList: RemindersList! - let _ = try! prepareDependencies { + private static var reminderDetail: (Reminder, RemindersList) = { + try! prepareDependencies { $0.defaultDatabase = try Reminders.appDatabase() - try $0.defaultDatabase.read { db in - reminder = try Reminder.fetchOne(db) - remindersList = try RemindersList.fetchOne(db)! + try $0.defaultDatabase.seed() + return try $0.defaultDatabase.read { db in + let reminder = try Reminder.fetchOne(db)! + let remindersList = try RemindersList.where { $0.id.eq(reminder.remindersListID) }.fetchOne(db)! + return (reminder, remindersList) } } - + }() + + static var previews: some View { + let (reminder, remindersList) = reminderDetail NavigationStack { List { ReminderRow( diff --git a/Examples/Reminders/RemindersApp.swift b/Examples/Reminders/RemindersApp.swift index b9c3eb88..93b7b845 100644 --- a/Examples/Reminders/RemindersApp.swift +++ b/Examples/Reminders/RemindersApp.swift @@ -18,7 +18,7 @@ struct RemindersApp: App { init() { if context == .live { try! prepareDependencies { - try $0.bootstrapDatabase(syncEngineDelegate: syncEngineDelegate, seedSampleData: false) + try $0.bootstrapDatabase(syncEngineDelegate: syncEngineDelegate) } } } diff --git a/Examples/Reminders/RemindersDetail.swift b/Examples/Reminders/RemindersDetail.swift index b64d8110..cd9fe527 100644 --- a/Examples/Reminders/RemindersDetail.swift +++ b/Examples/Reminders/RemindersDetail.swift @@ -362,9 +362,10 @@ extension RemindersDetailModel.DetailType { } struct RemindersDetailPreview: PreviewProvider { - static var previews: some View { + private static var detailTypes: [RemindersDetailModel.DetailType] = { let (remindersList, tag) = try! prepareDependencies { $0.defaultDatabase = try Reminders.appDatabase() + try $0.defaultDatabase.seed() return try $0.defaultDatabase.read { db in ( try RemindersList.fetchOne(db)!, @@ -372,11 +373,14 @@ struct RemindersDetailPreview: PreviewProvider { ) } } - let detailTypes: [RemindersDetailModel.DetailType] = [ + return [ .all, .remindersList(remindersList), .tags([tag]), ] + }() + + static var previews: some View { ForEach(detailTypes, id: \.self) { detailType in NavigationStack { RemindersDetailView(model: RemindersDetailModel(detailType: detailType)) @@ -385,3 +389,4 @@ struct RemindersDetailPreview: PreviewProvider { } } } + diff --git a/Examples/Reminders/RemindersLists.swift b/Examples/Reminders/RemindersLists.swift index aba9e7d4..3bd650fa 100644 --- a/Examples/Reminders/RemindersLists.swift +++ b/Examples/Reminders/RemindersLists.swift @@ -144,9 +144,7 @@ class RemindersListsModel { #if DEBUG func seedDatabaseButtonTapped() { withErrorReporting { - try database.write { db in - try db.seedSampleData() - } + try database.seed() } } #endif @@ -436,12 +434,22 @@ private struct ReminderGridCell: View { } #Preview { - withErrorReporting { - try prepareDependencies { - try $0.bootstrapDatabase(seedSampleData: false) + let _ = try! prepareDependencies { + $0.defaultDatabase = try Reminders.appDatabase() + // Create a dummy SyncMetadata table to allow the RemindersLists query to work in preview mode + try $0.defaultDatabase.write { db in + try #sql(""" + CREATE TABLE "sqlitedata_icloud_metadata" ( + "recordPrimaryKey" TEXT, + "recordType" TEXT, + "share" TEXT + ) STRICT + """ + ) + .execute(db) } } - return NavigationStack { + NavigationStack { RemindersListsView(model: RemindersListsModel()) } } diff --git a/Examples/Reminders/Schema.swift b/Examples/Reminders/Schema.swift index ea7b8ebb..2f0180a3 100644 --- a/Examples/Reminders/Schema.swift +++ b/Examples/Reminders/Schema.swift @@ -116,8 +116,8 @@ struct ReminderText: FTS5 { } extension DependencyValues { - mutating func bootstrapDatabase(syncEngineDelegate: (any SyncEngineDelegate)? = nil, seedSampleData: Bool) throws { - defaultDatabase = try Reminders.appDatabase(seedSampleData: seedSampleData) + mutating func bootstrapDatabase(syncEngineDelegate: (any SyncEngineDelegate)? = nil) throws { + defaultDatabase = try Reminders.appDatabase() defaultSyncEngine = try SyncEngine( for: defaultDatabase, tables: RemindersList.self, @@ -363,12 +363,6 @@ func appDatabase(seedSampleData: Bool = true) throws -> any DatabaseWriter { } ) .execute(db) - - #if DEBUG - if seedSampleData { - try db.seedSampleData() - } - #endif } return database @@ -412,8 +406,8 @@ nonisolated func createDefaultRemindersList() { nonisolated private let logger = Logger(subsystem: "Reminders", category: "Database") #if DEBUG - extension Database { - func seedSampleData() throws { + extension DatabaseWriter { + func seed() throws { @Dependency(\.date.now) var now @Dependency(\.uuid) var uuid var remindersListIDs: [UUID] = [] @@ -424,122 +418,124 @@ nonisolated private let logger = Logger(subsystem: "Reminders", category: "Datab for _ in 0...10 { reminderIDs.append(uuid()) } - try seed { - RemindersList( - id: remindersListIDs[0], - color: Color(red: 0x4a / 255, green: 0x99 / 255, blue: 0xef / 255), - title: "Personal" - ) - RemindersList( - id: remindersListIDs[1], - color: Color(red: 0xed / 255, green: 0x89 / 255, blue: 0x35 / 255), - title: "Family" - ) - RemindersList( - id: remindersListIDs[2], - color: Color(red: 0xb2 / 255, green: 0x5d / 255, blue: 0xd3 / 255), - title: "Business" - ) - Reminder( - id: reminderIDs[0], - notes: "Milk\nEggs\nApples\nOatmeal\nSpinach", - remindersListID: remindersListIDs[0], - title: "Groceries" - ) - Reminder( - id: reminderIDs[1], - dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), - isFlagged: true, - remindersListID: remindersListIDs[0], - title: "Haircut" - ) - Reminder( - id: reminderIDs[2], - dueDate: now, - notes: "Ask about diet", - priority: .high, - remindersListID: remindersListIDs[0], - title: "Doctor appointment" - ) - Reminder( - id: reminderIDs[3], - dueDate: now.addingTimeInterval(-60 * 60 * 24 * 190), - remindersListID: remindersListIDs[0], - status: .completed, - title: "Take a walk" - ) - Reminder( - id: reminderIDs[4], - dueDate: now, - remindersListID: remindersListIDs[0], - title: "Buy concert tickets" - ) - Reminder( - id: reminderIDs[5], - dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), - isFlagged: true, - priority: .high, - remindersListID: remindersListIDs[1], - title: "Pick up kids from school" - ) - Reminder( - id: reminderIDs[6], - dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), - priority: .low, - remindersListID: remindersListIDs[1], - status: .completed, - title: "Get laundry" - ) - Reminder( - id: reminderIDs[7], - dueDate: now.addingTimeInterval(60 * 60 * 24 * 4), - priority: .high, - remindersListID: remindersListIDs[1], - status: .incomplete, - title: "Take out trash" - ) - Reminder( - id: reminderIDs[8], - dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), - notes: """ + try write { db in + try db.seed { + RemindersList( + id: remindersListIDs[0], + color: Color(red: 0x4a / 255, green: 0x99 / 255, blue: 0xef / 255), + title: "Personal" + ) + RemindersList( + id: remindersListIDs[1], + color: Color(red: 0xed / 255, green: 0x89 / 255, blue: 0x35 / 255), + title: "Family" + ) + RemindersList( + id: remindersListIDs[2], + color: Color(red: 0xb2 / 255, green: 0x5d / 255, blue: 0xd3 / 255), + title: "Business" + ) + Reminder( + id: reminderIDs[0], + notes: "Milk\nEggs\nApples\nOatmeal\nSpinach", + remindersListID: remindersListIDs[0], + title: "Groceries" + ) + Reminder( + id: reminderIDs[1], + dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), + isFlagged: true, + remindersListID: remindersListIDs[0], + title: "Haircut" + ) + Reminder( + id: reminderIDs[2], + dueDate: now, + notes: "Ask about diet", + priority: .high, + remindersListID: remindersListIDs[0], + title: "Doctor appointment" + ) + Reminder( + id: reminderIDs[3], + dueDate: now.addingTimeInterval(-60 * 60 * 24 * 190), + remindersListID: remindersListIDs[0], + status: .completed, + title: "Take a walk" + ) + Reminder( + id: reminderIDs[4], + dueDate: now, + remindersListID: remindersListIDs[0], + title: "Buy concert tickets" + ) + Reminder( + id: reminderIDs[5], + dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), + isFlagged: true, + priority: .high, + remindersListID: remindersListIDs[1], + title: "Pick up kids from school" + ) + Reminder( + id: reminderIDs[6], + dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), + priority: .low, + remindersListID: remindersListIDs[1], + status: .completed, + title: "Get laundry" + ) + Reminder( + id: reminderIDs[7], + dueDate: now.addingTimeInterval(60 * 60 * 24 * 4), + priority: .high, + remindersListID: remindersListIDs[1], + status: .incomplete, + title: "Take out trash" + ) + Reminder( + id: reminderIDs[8], + dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), + notes: """ Status of tax return Expenses for next year Changing payroll company """, - remindersListID: remindersListIDs[2], - title: "Call accountant" - ) - Reminder( - id: reminderIDs[9], - dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), - priority: .medium, - remindersListID: remindersListIDs[2], - status: .completed, - title: "Send weekly emails" - ) - Reminder( - id: reminderIDs[10], - dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), - remindersListID: remindersListIDs[2], - status: .incomplete, - title: "Prepare for WWDC" - ) - let tagIDs = ["car", "kids", "someday", "optional", "social", "night", "adulting"] - for tagID in tagIDs { - Tag(title: tagID) + remindersListID: remindersListIDs[2], + title: "Call accountant" + ) + Reminder( + id: reminderIDs[9], + dueDate: now.addingTimeInterval(-60 * 60 * 24 * 2), + priority: .medium, + remindersListID: remindersListIDs[2], + status: .completed, + title: "Send weekly emails" + ) + Reminder( + id: reminderIDs[10], + dueDate: now.addingTimeInterval(60 * 60 * 24 * 2), + remindersListID: remindersListIDs[2], + status: .incomplete, + title: "Prepare for WWDC" + ) + let tagIDs = ["car", "kids", "someday", "optional", "social", "night", "adulting"] + for tagID in tagIDs { + Tag(title: tagID) + } + ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[2]) + ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[3]) + ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[6]) + ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[2]) + ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[3]) + ReminderTag.Draft(reminderID: reminderIDs[2], tagID: tagIDs[6]) + ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[0]) + ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[1]) + ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[4]) + ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[4]) + ReminderTag.Draft(reminderID: reminderIDs[10], tagID: tagIDs[4]) + ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[5]) } - ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[2]) - ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[3]) - ReminderTag.Draft(reminderID: reminderIDs[0], tagID: tagIDs[6]) - ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[2]) - ReminderTag.Draft(reminderID: reminderIDs[1], tagID: tagIDs[3]) - ReminderTag.Draft(reminderID: reminderIDs[2], tagID: tagIDs[6]) - ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[0]) - ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[1]) - ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[4]) - ReminderTag.Draft(reminderID: reminderIDs[3], tagID: tagIDs[4]) - ReminderTag.Draft(reminderID: reminderIDs[10], tagID: tagIDs[4]) - ReminderTag.Draft(reminderID: reminderIDs[4], tagID: tagIDs[5]) } } } diff --git a/Examples/Reminders/TagsForm.swift b/Examples/Reminders/TagsForm.swift index c40b777a..6fb325a8 100644 --- a/Examples/Reminders/TagsForm.swift +++ b/Examples/Reminders/TagsForm.swift @@ -164,6 +164,7 @@ private struct TagView: View { @Previewable @State var tags: [Tag] = [] let _ = try! prepareDependencies { $0.defaultDatabase = try Reminders.appDatabase() + try $0.defaultDatabase.seed() } TagsView(selectedTags: $tags) diff --git a/Examples/RemindersTests/Internal.swift b/Examples/RemindersTests/Internal.swift index 0ba99036..d4a189a2 100644 --- a/Examples/RemindersTests/Internal.swift +++ b/Examples/RemindersTests/Internal.swift @@ -11,7 +11,8 @@ import Testing .dependency(\.date.now, Date(timeIntervalSince1970: 1_234_567_890)), .dependency(\.uuid, .incrementing), .dependencies { - try $0.bootstrapDatabase(seedSampleData: true) + try $0.bootstrapDatabase() + try $0.defaultDatabase.seed() try await $0.defaultSyncEngine.sendChanges() }, .snapshots(record: .failed) From 8d1c958375ccc661b57bf77977545ba06301a091 Mon Sep 17 00:00:00 2001 From: Jean-Charles Mourey Date: Wed, 17 Dec 2025 19:17:42 +0100 Subject: [PATCH 3/4] remove obsolete seedSampleData arg to appDatabase --- Examples/Reminders/Schema.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/Reminders/Schema.swift b/Examples/Reminders/Schema.swift index 2f0180a3..967eb747 100644 --- a/Examples/Reminders/Schema.swift +++ b/Examples/Reminders/Schema.swift @@ -130,7 +130,7 @@ extension DependencyValues { } } -func appDatabase(seedSampleData: Bool = true) throws -> any DatabaseWriter { +func appDatabase() throws -> any DatabaseWriter { @Dependency(\.context) var context var configuration = Configuration() configuration.foreignKeysEnabled = true From 5474e8dfb1c0c1b4d588a517918164c0e742edce Mon Sep 17 00:00:00 2001 From: Jean-Charles Mourey Date: Sat, 20 Dec 2025 22:31:11 +0100 Subject: [PATCH 4/4] Don't hardcode the internal table name of SyncMetadata (safe to use the type name since it's not an actual migration). Only create the table if it wasn't already created --- Examples/Reminders/RemindersLists.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/Reminders/RemindersLists.swift b/Examples/Reminders/RemindersLists.swift index 3bd650fa..f50226e5 100644 --- a/Examples/Reminders/RemindersLists.swift +++ b/Examples/Reminders/RemindersLists.swift @@ -439,7 +439,7 @@ private struct ReminderGridCell: View { // Create a dummy SyncMetadata table to allow the RemindersLists query to work in preview mode try $0.defaultDatabase.write { db in try #sql(""" - CREATE TABLE "sqlitedata_icloud_metadata" ( + CREATE TABLE IF NOT EXISTS \(SyncMetadata.self) ( "recordPrimaryKey" TEXT, "recordType" TEXT, "share" TEXT