M1设备调用MagicalRecord设置CoreData栈报sqlite格式错误如何解决?
M1芯片设备MagicalRecord初始化CoreData栈SQLite格式错误排查方案
报错详情:
Error Message: The file “xxxx.sqlite” couldn’t be opened because it isn’t in the correct format. Error Domain: NSCocoaErrorDomain Recovery Suggestion: The file might be corrupted, truncated, or in an unexpected format.触发代码:
MagicalRecord.setupCoreDataStack(withAutoMigratingSqliteStoreNamed: name)
常见诱因
- 架构兼容问题:M1为arm64架构,若对应SQLite存储文件是在x86_64架构的Intel芯片设备上生成的,低版本MagicalRecord/CoreData的自动迁移逻辑未适配跨架构存储格式兼容,会误判为格式异常
- 本地SQLite文件损坏:程序上次运行异常退出、磁盘空间不足导致写入中断、沙盒权限变更都会引发文件被截断或部分写入失败
- 低版本MagicalRecord适配缺陷:2.3.3及更早版本的MagicalRecord未适配M1芯片的CoreData栈初始化逻辑,自动迁移时会将正常存储文件误判为格式错误
- CoreData模型版本冲突:未按要求递增CoreData模型版本号,自动迁移逻辑找不到对应的迁移路径,会抛出格式错误提示
解决方案
- 架构兼容修复
- 若为首次在M1设备上运行旧版本生成的存储文件,先到Xcode项目设置-「Build Settings」-「Excluded Architectures」中,移除Debug模式下对arm64架构的排除配置,确保项目以原生arm64架构运行而非Rosetta转译
- 若转译运行仍报错,可先导出原有SQLite数据,在M1设备上重新初始化存储文件后批量导入历史数据即可
- 损坏文件修复
- 先备份沙盒内的
xxxx.sqlite、xxxx.sqlite-wal、xxxx.sqlite-shm三个关联文件,调用MagicalRecord.cleanUp()清理现有栈后删除损坏的存储文件,重新初始化栈即可。需要恢复数据的话,可通过第三方SQLite工具打开备份的sqlite文件导出数据再写入新存储
- 先备份沙盒内的
- 依赖版本更新
- 升级MagicalRecord到2.3.4及以上版本,该版本已修复M1芯片下CoreData栈初始化的格式识别问题
- 模型迁移配置修复
- 确认每次修改CoreData模型都新增了模型版本,且设置了正确的默认模型版本,初始化时补全自动迁移参数:
MagicalRecord.setupCoreDataStack(withAutoMigratingSqliteStoreNamed: name, options: [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true ]) - 开发阶段无需保留历史数据的话,直接删除沙盒内的旧存储文件,重新初始化即可快速解决问题
- 确认每次修改CoreData模型都新增了模型版本,且设置了正确的默认模型版本,初始化时补全自动迁移参数:
内容的提问来源于stack exchange,提问作者Umar Maikano
相关产品推荐
相关产品推荐

