Swiftdata - reset the database from archived files with swiftui without a app restart

HI, swiftdata is new to me and any help would be appreciated. In my swiftui app I have a functionality that reinstates the database from an archive. I first move the three database files (database.store datebase.store-wal and database.store-shm) to a new name (.tmp added for backup incase) and then copy the Archived three files to the same location. the move creates the following errors:

" BUG IN CLIENT OF libsqlite3.dylib: database integrity compromised by API violation: vnode renamed while in use: /private/var/mobile/Containers/Data/Application/499A6802-02E5-4547-83C4-88389AEA50F5/Library/Application Support/database.store.tmp invalidated open fd: 4 (0x20)"

I get the same message in console for all three files. then I reinitialise the model container and get no errors as my code below .... let schema = Schema([....my different models are here]) let config = ModelConfiguration("database", schema: schema) do { // Recreate the container with the same store URL let container = try ModelContainer(for: schema, configurations: config) print("ModelContainer reinitialized successfully!") } catch { print("Failed to reinitialize ModelContainer: (error)") } }

I get the success message but when I leave the view (backup-restore view) to the main view I get:

CoreData: error: (6922) I/O error for database at /var/mobile/Containers/Data/Application/499A6802-02E5-4547-83C4-88389AEA50F5/Library/Application Support/database.store. SQLite error code:6922, 'disk I/O error' and error: SQLCore dispatchRequest: exception handling request: <NSSQLFetchRequestContext: 0x302920460> , I/O error for database at /var/mobile/Containers/Data/Application/499A6802-02E5-4547-83C4-88389AEA50F5/Library/Application Support/database.store. SQLite error code:6922, 'disk I/O error' with userInfo of { NSFilePath = "/var/mobile/Containers/Data/Application/499A6802-02E5-4547-83C4-88389AEA50F5/Library/Application Support/database.store"; NSSQLiteErrorDomain = 6922; } error: -executeRequest: encountered exception = I/O error for database at /var/mobile/Containers/Data/Application/499A6802-02E5-4547-83C4-88389AEA50F5/Library/Application Support/database.store. SQLite error code:6922, 'disk I/O error' with userInfo = { NSFilePath = "/var/mobile/Containers/Data/Application/499A6802-02E5-4547-83C4-88389AEA50F5/Library/Application Support/database.store"; NSSQLiteErrorDomain = 6922; } CoreData: error: SQLCore dispatchRequest: exception handling request: <NSSQLFetchRequestContext: 0x302920460> , I/O error for database at /var/mobile/Containers/Data/Application/499A6802-02E5-4547-83C4-88389AEA50F5/Library/Application Support/database.store. SQLite error code:6922, 'disk I/O error' with userInfo of { NSFilePath = "/var/mobile/Containers/Data/Application/499A6802-02E5-4547-83C4-88389AEA50F5/Library/Application Support/database.store"; NSSQLiteErrorDomain = 6922; }

Can anyone let me know how I should go about this - reseting the database from old backup files by copying over them. or if there is a way to stop the database and restart it with the new files in swiftdata

my app is an ios app for phone and ipad

Answered by DTS Engineer in 827002022

... but when I leave the view (backup-restore view) to the main view I get: CoreData: error ...

I believe that was because your main view hierarchy still used models or a model context tied to the orignal model container instance.

You can try to reload all the SwiftUI views that use SwiftData models after re-creating the model container, which typically means that you manage a SwiftUI state, and change it after re-creating the container, which tells SwiftUI to reload the whole view hierarchy that use SwiftData.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

... but when I leave the view (backup-restore view) to the main view I get: CoreData: error ...

I believe that was because your main view hierarchy still used models or a model context tied to the orignal model container instance.

You can try to reload all the SwiftUI views that use SwiftData models after re-creating the model container, which typically means that you manage a SwiftUI state, and change it after re-creating the container, which tells SwiftUI to reload the whole view hierarchy that use SwiftData.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

Thank you for your reply, and I agree that is what is happening. I do the following - reloading reinitialise the model container and get no errors as my code below .... let schema = Schema([....my different models are here]) let config = ModelConfiguration("database", schema: schema) do { // Recreate the container with the same store URL let container = try ModelContainer(for: schema, configurations: config) print("ModelContainer reinitialized successfully!") } catch { print("Failed to reinitialize ModelContainer: (error)") } } maybe I will create a function and places in the contentview view (the main view that initially creates the container) and change it to have a reload that will reset the container and as it is passed in the environment should get reloaded. thanks

Swiftdata - reset the database from archived files with swiftui without a app restart
 
 
Q