修改SwiftData模型后初始化ModelContainer崩溃,报错134110求助
SwiftData模型重构后ModelContainer初始化崩溃(NSCocoaErrorDomain 134110)解决思路
这个134110错误本质是持久化存储文件与重构后的模型不兼容,SwiftData的自动迁移机制无法处理你这次的模型变更,以下是针对性解决方法:
一、开发阶段快速解决:彻底清除旧存储文件
适合不需要保留现有测试数据的场景,直接删掉旧的持久化文件即可:
- 最简单的方式:在模拟器/真机上卸载你的App,重新运行
- 或者通过代码强制删除旧存储(仅开发阶段用):
struct myApp: App { init() { do { var config = ModelConfiguration(for: Role.self) // 删除旧的持久化文件 if let storeURL = config.url { try? FileManager.default.removeItem(at: storeURL) } container = try ModelContainer(for: Role.self, configurations: config) // 后续代码... } catch { fatalError("Failed to initialize ModelContainer: \(error)") } } }
二、需要保留数据:启用模型自动迁移
如果要保留现有数据,需在初始化容器时开启Core Data兼容的自动迁移选项,让系统尝试自动处理模型变更:
struct myApp: App { init() { do { let options = ModelConfiguration.Options() // 开启自动迁移 options.setPersistentStoreOption(true as NSNumber, forKey: NSMigratePersistentStoresAutomaticallyOption) // 让系统自动推断映射模型 options.setPersistentStoreOption(true as NSNumber, forKey: NSInferMappingModelAutomaticallyOption) let config = ModelConfiguration(for: Role.self, options: options) container = try ModelContainer(for: Role.self, configurations: config) // 后续代码... } catch { fatalError("Failed to initialize ModelContainer: \(error)") } } }
三、复杂模型变更:手动管理模型版本
如果自动迁移失败(比如修改了属性类型、删除必填属性等),需要手动标记模型版本:
- 给旧版本模型添加版本标识符(重构前的代码):
@Model(versionIdentifier: "1") class Role { // 旧模型属性 }
- 重构后的新模型使用新的版本标识符:
@Model(versionIdentifier: "2") class Role { // 新模型属性 }
- 若系统仍无法自动推断映射,需要创建手动映射模型(通过Xcode的Core Data模型文件辅助创建,再关联到SwiftData的配置中)
四、排查模型重构的风险点
检查你这次重构是否包含以下可能导致迁移失败的操作:
- 删除了带有
@Attribute(.unique)或必填的属性 - 修改了属性的基础数据类型(如
String改为Int) - 更改了实体类的名称
- 添加了新的必填属性但未设置默认值
内容的提问来源于stack exchange,提问作者CameronBaba
相关产品推荐
相关产品推荐

