How to disable WAL journal mode
From Apple Technical Documentation: Technical Q&A QA1809
NSDictionary *options = @{NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}};
if (! [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:options
error:&error]) {
// error handling.
}
Edit 2020:
SwiftUI + iOS 14 (Xcode 12 beta 6)
When you create a new project with SwiftUI and check CoreData template, your new project has this code in Persistence.swift file:
struct PersistenceController {
static let shared = PersistenceController()
//...
let container: NSPersistentContainer
init(inMemory: Bool = false) {
container = NSPersistentContainer(name: "db_name")
if inMemory {
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
}
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
//...
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
}
}
Now, you can add the following block of code after init container (container = NSPersistentContainer(name: "db_name")
)
if let url = container.persistentStoreDescriptions.first?.url {
let storeDescription = NSPersistentStoreDescription(url: url)
storeDescription.setValue("DELETE" as NSObject, forPragmaNamed: "journal_mode")
container.persistentStoreDescriptions = [storeDescription]
}
To disable WAL mode, set the journal_mode to DELETE
NSMutableDictionary *pragmaOptions = [NSMutableDictionary dictionary];
[pragmaOptions setObject:@"DELETE" forKey:@"journal_mode"];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, pragmaOptions, NSSQLitePragmasOption, nil];
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]