Realm多数据库使用问题:无法实现User、Person模型分库存储
问题根因
之前的写法会把两个表都建到第一个库,核心是对Realm的schema规则和配置使用存在误解:
- Realm默认的schema扫描规则是:只要打开某一个Realm实例,会自动把项目中所有继承自
Object的模型类,全部注册到当前Realm的可用表结构里,哪怕你根本不会用这个库存对应模型。 - 反复修改
Realm.Configuration.defaultConfiguration的写法完全是错误使用:第一次改配置打开user.realm的时候,已经把User、Person两个类的结构都写进了这个库的schema;后续就算再改配置打开person.realm,已经生成的user.realm里的双表结构是不会自动消失的。
正确实现方式
完全不需要依赖全局默认配置,也不要让Realm自动扫描全量模型,每个数据库配置显式绑定它对应的模型类列表即可:
- 提前定义两个独立的固定配置,不要用局部变量反复覆盖、不要修改全局默认配置:
// user.realm专属配置,仅关联User模型 let userRealmConfig = Realm.Configuration( fileURL: dataPath.appendingPathComponent("user.realm"), objectTypes: [User.self] // *核心配置:指定当前库仅包含User表* ) // person.realm专属配置,仅关联Person模型 let personRealmConfig = Realm.Configuration( fileURL: dataPath.appendingPathComponent("person.realm"), objectTypes: [Person.self] // *核心配置:指定当前库仅包含Person表* )
- 操作对应数据库时,直接把匹配的配置传入Realm初始化方法,完全不碰全局默认配置:
// 打开user.realm,仅识别、创建User表 let userRealm = try! Realm(configuration: userRealmConfig) // 打开person.realm,仅识别、创建Person表 let personRealm = try! Realm(configuration: personRealmConfig)
落地注意事项
- 如果之前测试时已经生成过包含双表结构的
user.realm文件,需要先删掉本地沙盒里的旧数据库文件再重新运行,否则残留的旧schema会一直存在,不会自动清理。 - 绝对不要用“修改全局默认配置→打开对应Realm→再改回默认配置”的多库切换逻辑,这种写法在多线程环境下很容易出现配置串用、打开错库的问题,所有数据库配置提前固化为常量、按需传参是最稳定的方案。
- 原代码中
Person类存在语法小问题:objc dynamic前缀缺失@,正确写法为@objc dynamic var name:String = "",否则无法正常编译。
内容的提问来源于stack exchange,提问作者Li Dong
相关产品推荐
相关产品推荐

