Realm Kotlin SDK如何预填充realm文件 实现assetFile等效配置
Realm Kotlin SDK 实现assets目录预填充数据库方案
Realm Kotlin SDK 未提供和Java SDK 同名的assetFile()配置方法,等效能力通过initialData配置回调实现,和原Java SDK预填充逻辑行为完全一致。
实现步骤
- 保持原有文件放置规则不变:将提前生成好的
populated.realm预填充文件放在工程assets目录下。 - 构建
RealmConfiguration时,在initialData回调中判断是否为首次创建库文件,若为首次创建则直接将assets内的realm文件拷贝覆盖到Realm默认生成的空库路径即可。 - 其余配置项(schema版本、启动压缩、加密key、主线程读写权限等)和原有逻辑保持一致。
注意:如果使用加密Realm,assets目录下存放的预填充realm文件必须使用配置中传入的完全相同的加密密钥生成,否则打开库时会抛出校验失败异常。
等效实现代码
import android.content.Context import io.realm.kotlin.RealmConfiguration import java.io.File import java.io.FileOutputStream fun getPopulatedRealmConfig(context: Context): RealmConfiguration { val realmName = "populated.realm" val encryptKey = resolveEncrypt(RealmHelperStatics.EncRealmKey).toByteArray() return RealmConfiguration.Builder( schema = setOf(/* 替换为项目中所有RealmObject实体类 */) ) .schemaVersion(REALM_VERSION) .compactOnLaunch() .encryptionKey(encryptKey) .name(realmName) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) // 等效原.assetFile()的核心逻辑 .initialData { val targetRealmFile = File(configuration.path) // 仅首次创建空库时执行拷贝,不会覆盖后续用户产生的数据 if (targetRealmFile.length() == 0L) { context.assets.open(realmName).use { inputStream -> FileOutputStream(targetRealmFile).use { outputStream -> inputStream.copyTo(outputStream) } } } } .build() }
逻辑说明
initialData回调仅在Realm文件首次创建时触发一次,和原Java SDKassetFile()的执行时机完全一致,不会重复执行覆盖本地已有数据。- 文件拷贝操作运行在Realm内部管控的写线程中,不需要手动做线程切换。
- Kotlin SDK采用跨平台设计,因此没有单独封装Android平台专属的assets读取方法,将预填充逻辑开放到
initialData回调中,除了assets路径外,也支持从私有目录、本地下载路径等任意位置加载预填充库文件,灵活度更高。
内容的提问来源于stack exchange,提问作者kadirgun
相关产品推荐
相关产品推荐

