How to disable WAL journal mode

后端 未结 3 492
隐瞒了意图╮
隐瞒了意图╮ 2020-11-29 09:37

https://developer.apple.com/library/ios/releasenotes/DataManagement/WhatsNew_CoreData_iOS/

I am having trouble in disabling journal mode.

My code is:

相关标签:
3条回答
  • 2020-11-29 10:12

    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]
    }
    
    0 讨论(0)
  • 2020-11-29 10:23

    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]
    
    0 讨论(0)
  • 2020-11-29 10:26

    For Swift 2 it would be the following:

        let dict: [NSObject : AnyObject] = [
            NSSQLitePragmasOption: ["journal_mode":"DELETE"]
        ]
    
        do {
            try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: dict)
        } catch {
            // Report any error we got.
            var dict = [String: AnyObject]()
            dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
            dict[NSLocalizedFailureReasonErrorKey] = failureReason
    
            dict[NSUnderlyingErrorKey] = error as! NSError
            let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
            // Replace this with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
            abort()
        }
    
    0 讨论(0)
提交回复
热议问题