Problems With Core Data Migration Manager and Journal_mode WAL
When you use a Migration Manager, Core Data will create a new database for you, and start copying the entities one by one from the old DB to the new one.
As we are using
journal_mode = WAL
, there’s an additional file besidesDB.sqlite
calledDB.sqlite-wal
.From what I can tell, the problem seems to be that Core Data creates a temporary DB, inserts everything there, and when it renames it to the original name, the
-wal
file is kept as a leftover from the old version. The problem is that you end up with an inconsistent DB.
A different part of Core Data is aware of the multiple files, though:
To safely back up and restore a Core Data SQLite store, you can do the following:
Use the following method of
NSPersistentStoreCoordinator
class, rather than file system APIs, to back up and restore the Core Data store:
- (NSPersistentStore *)migratePersistentStore:(NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)error
Note that this is the option we recommend.
Change to rollback journaling mode when adding the store to a persistent store coordinator if you have to copy the store file.