使用Realm作为数据库的App如何预置演示数据至审核安装包中
预置Realm演示数据到应用安装包的实现方案
1. 生成带演示数据的Realm文件
你可以任选以下两种方式生成填充好数据的Realm文件:
- 开发环境下在项目中写临时写入逻辑,在模拟器/调试设备中把所有需要的演示数据完整写入Realm,之后从设备沙盒中导出生成的
default.realm文件,以及对应的.realm.lock、.realm.management附属文件(如果有需要) - 直接使用Realm Studio可视化工具新建数据库,手动导入/录入演示数据后导出完整文件
注意:生成文件使用的Realm版本必须和应用线上依赖的Realm版本完全一致,避免出现版本兼容无法打开数据库的问题
2. 将Realm文件加入应用资源包
- iOS:把导出的Realm相关文件拖入Xcode工程,勾选「Copy items if needed」,确认目标Target的
Build Phases -> Copy Bundle Resources列表中已经包含这些文件 - Android:把导出的Realm相关文件放到项目的
src/main/assets目录下
3. 应用首次启动时拷贝预置文件到可读写目录
应用包内的资源文件是只读的,而Realm运行时需要读写权限,因此需要在初始化Realm之前增加判断逻辑:如果沙盒可读写目录下没有对应的Realm数据库文件,就把资源包中预置的Realm文件完整拷贝到目标路径,再初始化Realm。
iOS Swift 代码示例
// 获取默认Realm路径 guard let defaultRealmUrl = Realm.Configuration.defaultConfiguration.fileURL else { return } let defaultRealmPath = defaultRealmUrl.path // 获取Bundle中预置的Realm路径 guard let bundleRealmPath = Bundle.main.path(forResource: "default", ofType: "realm") else { return } if !FileManager.default.fileExists(atPath: defaultRealmPath) { do { try FileManager.default.copyItem(atPath: bundleRealmPath, toPath: defaultRealmPath) } catch { print("预置Realm文件拷贝失败: \(error.localizedDescription)") } } // 之后正常初始化Realm即可 let realm = try? Realm()
Android Kotlin 代码示例
val realmFile = File(filesDir, "default.realm") if (!realmFile.exists()) { kotlin.runCatching { assets.open("default.realm").use { inputStream -> FileOutputStream(realmFile).use { outputStream -> inputStream.copyTo(outputStream) } } }.onFailure { it.printStackTrace() } } // 之后正常初始化Realm即可 val config = RealmConfiguration.Builder() .name("default.realm") .build() val realm = Realm.getInstance(config)
验证注意事项
- 如果你的Realm开启了加密,要保证生成预置文件时使用的加密密钥和应用运行时传入的密钥完全一致
- 应用版本升级时如果需要更新预置演示数据,一定要增加版本判断逻辑,避免覆盖用户已经生成的真实业务数据
- 归档打包前可以先打个测试包安装到未安装过应用的真机上,断网启动验证是否能正常加载演示数据,确认配置无误后再提交审核
内容的提问来源于stack exchange,提问作者Flo
相关产品推荐
相关产品推荐

