android - 辅助 .realm 文件 getInstance 花费的时间太长

标签 android kotlin realm realm-mobile-platform realm-migration

By secondary .realm file I mean a realm file which is not the default.realm file.

我有两个 .realm 文件——一个是标准的 default.realm,另一个是 aux.realm

正常情况下一切正常,但是当我执行繁重的操作时(多个表经历 .deleteAllFromRealm() 并重新同步所有内容)而这发生在工作线程上,用户仍然可以自由执行任何 UI Activity ,只要执行涉及 aux.realm 实例的任何交互,应用程序就会关闭并出现 ANR。

通过一些广泛的调试,我发现 getAuxRealmInstance 需要很多时间来传递实例,即使它的值应该被缓存。尽管事实上它的配置已经延迟加载了。因此,不清楚为什么要花这么多时间?

我也认为这可能是交易问题,因为一次只能有一个 Activity 交易,但我不确定规则是否也通过文件有效,比如两个 Realm 文件是否可以有自己的事务并行运行?

我的 aux.realm 文件:

private const val FILE_NAME = "auxiliary.realm"
private val auxiliaryConfiguration  = lazy {
    RealmConfiguration.Builder()
            .name(FILE_NAME)
            .schemaVersion(AuxiliarySchemaVersionMappings.CURRENT_SCHEMA_VERSION)
            .modules(AuxiliaryRealmModule())
            .initialData {
                Log.d("AuxRealm", "running initial data migration: ")
                // initial version..
                // migrate the AppMetaData table from base realm to aux realm
                }
            }
            .migration(AuxiliaryRealmMigration())
            .build().also { Log.d("AuxRealm", "configuration created: ") }
}

fun getAuxiliaryRealmInstance(): Realm{
    return Realm.getInstance(auxiliaryConfiguration.value)
}

fun getAuxiliaryRealmInstanceAsync(callback: Realm.Callback): RealmAsyncTask{
    return Realm.getInstanceAsync(auxiliaryConfiguration.value, callback)
}

PS:如果我以异步方式加载 aux Realm 实例,ANR 就会消失,如上所述,这指向相同的问题。

环境变量: Realm :5.4.2,Kotlin 1.2.51

最佳答案

我通过缓存 Realm 实例解决了这个问题:

private Realm auxiliaryRealmInstance;

fun getAuxiliaryRealmInstance(): Realm{
return auxiliaryRealmInstance == null ? Realm.getInstance(auxiliaryConfiguration.value) : auxiliaryRealmInstance;
}

这个解决方法应该不是必需的,因为 here据记载,缓存不会使任何事情变得更有效率。但到目前为止我没有注意到任何缺点。

关于android - 辅助 .realm 文件 getInstance 花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51844730/

相关文章:

ios - Realm LinkingObjects 第二级返回零

android - Mapbox Android SDK : Bring marker to front

java - 无法在 Android < 21 中使用 Retrofit 2 连接到 HTTPS

swift - Realm 中的混合列表

android - NoClassDefFoundError 与 Kotlin 中的 ?.let{} block

java - 使用方法引用的 Kotlin setOnClickListener 不起作用

ios - NSPredicate 使用 RLMResults 作为参数

java - 通过 Intent 将值传递给新 Activity 时遇到问题

android - 错误 : Cannot figure out how to save this field into database.: Kotlin 房间

java - kotlin 内部类的目的是什么?