如何在SwiftUI 2项目中禁用Core Data的shm与wal选项?
如何在SwiftUI的Core Data中禁用SHM和WAL日志模式
你遇到的问题很典型——persistentStore的options属性是只读的,所以创建后再修改根本行不通。正确的做法是在加载持久化存储之前,就给存储描述配置好SQLite的pragma选项,这样Core Data在初始化存储的时候就会应用这些设置。
下面是修改后的PersistenceController完整代码,重点看init方法里的配置:
class PersistenceController { static let shared = PersistenceController() let container: NSPersistentContainer init(inMemory: Bool = false) { container = NSPersistentContainer(name: "MyApp") // 关键:在加载存储前配置SQLite的journal模式 if !inMemory { guard let description = container.persistentStoreDescriptions.first else { fatalError("无法获取持久化存储描述") } // 设置journal_mode为DELETE,禁用SHM和WAL let sqlitePragmas = [NSSQLitePragmasOption: ["journal_mode": "DELETE"]] description.setOption(sqlitePragmas as NSDictionary, forKey: NSPersistentStoreDefaultOptionsKey) } else { 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)") } }) } var context: NSManagedObjectContext { return container.viewContext } }
关键说明:
- 我们直接操作
container.persistentStoreDescriptions里的存储描述,这是在加载存储前可以修改的对象 - 通过
setOption(_:forKey:)方法添加NSSQLitePragmasOption,指定journal_mode为DELETE - 这个配置只会影响非内存模式的存储,内存模式我们保持原来的逻辑
这样配置后,SQLite就会使用传统的DELETE日志模式,不会生成.shm和.wal临时文件,事务完成后会直接删除日志文件。
内容的提问来源于stack exchange,提问作者Ronnie
相关产品推荐
相关产品推荐

