Realm从primaryKey()迁移到@Persisted主键时遇迁移错误求助
解决Realm从
@objc dynamic迁移到@Persisted时的主键Schema不匹配问题 问题根源
你遇到的SchemaMismatch错误,核心原因是Realm对主键的声明方式发生了本质变化:
- 旧版通过重写
primaryKey()类方法标记主键 - 新版通过
@Persisted(primaryKey: true)注解直接标记属性
Realm会将这种变更识别为「主键被移除」,必须通过显式迁移让Realm认可新的主键声明规则。
解决方案步骤
修正主键属性的初始化方式
不要在自定义init()方法中手动赋值主键,Realm要求@Persisted属性的默认值需直接声明,避免和Realm的主键管理逻辑冲突。修改MyObject模型:class MyObject: Object { @Persisted(primaryKey: true) @objc public var uuid: String = UUID().uuidString // 其他属性... override public required init() { super.init() // 移除手动赋值uuid的代码 } }添加显式迁移逻辑
在Realm配置中添加迁移块,即使没有数据转换需求,也需要声明迁移块确认你认可此次Schema变更:let config = Realm.Configuration( schemaVersion: 2, // 版本号需比旧版本+1 migrationBlock: { migration, oldSchemaVersion in if oldSchemaVersion < 2 { // 同步MyObject的主键数据 migration.enumerateObjects(ofType: MyObject.className()) { oldObject, newObject in guard let uuid = oldObject?["uuid"] as? String else { return } newObject?["uuid"] = uuid } // 处理关联模型的Schema变更(比如你提到的另一个模型) migration.enumerateObjects(ofType: YourOtherModel.className()) { oldObject, newObject in newObject?["id"] = oldObject?["id"] newObject?["categoryList"] = oldObject?["categoryList"] } } } ) Realm.Configuration.defaultConfiguration = config do { let realm = try Realm() } catch { print("Realm迁移失败: \(error)") }检查关联对象的Schema一致性
你提到的另一个模型中,categoryList从普通List改为@Persisted的List属于Schema变更,必须包含在迁移逻辑中。确保关联模型的所有属性都正确使用@Persisted注解,且迁移块覆盖了这些模型的处理。
关键注意事项
- 每次Schema变更都要递增
schemaVersion,禁止重复使用同一版本号 - 必须彻底移除旧版的
primaryKey()重写代码,不要混合新旧两种主键声明方式 - 需从Objective-C访问的属性保留
@objc注解是允许的,不会影响Realm的Schema识别
内容的提问来源于stack exchange,提问作者invalidArgument
相关产品推荐
相关产品推荐

