iOS模拟器CoreData创建的SQLite数据库内容无法在DB Browser for SQLite显示
CoreData SQLite文件复制后看不到数据?这是WAL模式在搞鬼!
嘿,这个问题我碰到好多次了!核心原因就是CoreData默认启用的**Write-Ahead Logging(WAL)**模式在搞事情,我给你拆解清楚:
为什么会出现这种情况?
CoreData默认用WAL模式来优化SQLite的性能和并发读写能力。在这个模式下,你通过select * from ZPRODUCT;查到的最新数据,其实并没有直接写入主数据库文件(比如你的.sqlite文件),而是临时存在两个辅助文件里:
YourDatabase.sqlite-wal:预写日志文件,保存着还没合并到主库的修改YourDatabase.sqlite-shm:共享内存文件,用于WAL读写的同步协调
你只复制了主.sqlite文件,没带上这两个“小伙伴”,所以用DB Browser打开后自然看不到最新的数据。
解决方法有两种,按需选择:
方法一:复制完整的三个文件(推荐)
去模拟器的App沙盒里找到CoreData数据库所在的文件夹,把以下三个文件一起复制到桌面:
YourDatabase.sqliteYourDatabase.sqlite-walYourDatabase.sqlite-shm
之后用DB Browser打开主.sqlite文件,再执行select * from ZPRODUCT;,就能看到和模拟器里一模一样的数据了。
方法二:关闭CoreData的WAL模式(不推荐,除非有特殊需求)
如果你确实只需要单个数据库文件,可以在初始化NSPersistentStoreCoordinator时添加配置参数,强制关闭WAL模式:
// 在添加持久化存储时设置选项 let storeOptions: [AnyHashable: Any] = [ NSSQLitePragmasOption: ["journal_mode": "DELETE"] ] do { try persistentStoreCoordinator.addPersistentStore( ofType: NSSQLiteStoreType, configurationName: nil, at: yourDatabaseURL, options: storeOptions ) } catch { // 处理初始化错误 fatalError("Persistent store initialization failed: \(error)") }
⚠️ 注意:WAL模式是CoreData默认的性能优化方案,关闭后可能会降低App的读写性能和并发处理能力,所以非必要不建议这么做。
内容的提问来源于stack exchange,提问作者Augusto
相关产品推荐
相关产品推荐

