【问题标题】:How to Close() all the instances of the Realm before deleting its file如何在删除文件之前关闭()领域的所有实例
【发布时间】:2017-11-14 02:10:48
【问题描述】:

我在尝试删除 realm 文件时得到了 java.lang.IllegalStateException

java.lang.IllegalStateException: 不允许删除与打开的 Realm 关联的文件。请记住在删除其文件之前关闭()领域的所有实例:/data/data/com.mypackage.name/files/filename.realm

我同时使用了executeTransactionAsyncexecuteTransaction 方法。所以,我猜有一个实例 async 在删除整个 realm 文件之前我无法关闭它。

如何关闭realm 的所有实例或如何删除realm 文件而不出现此异常?

【问题讨论】:

    标签: android realm realm-java


    【解决方案1】:

    没有更多细节很难回答,因为打开的实例可能来自很多地方。也许下面的两个链接可以为您如何使用 Realm 实例提供一些指导:

    https://realm.io/docs/java/latest/#closing-realmshttps://realm.io/docs/java/latest/#realm-instance-lifecycle

    【讨论】:

    • 感谢您的回复。和我想的一样。只是一个问题,为什么Realm 可以通过getLocgealInstanceCountgetGlobalInstanceCount 实例获取领域实例的数量,但不能获取实例列表?或者不是停止和关闭所有领域实例的本机函数。
    • 我们可以创建一个forceClose 方法,但这很可能会导致应用程序的其他部分崩溃,这就是我们没有添加它的原因。
    • 我明白了。以我有限的知识,我在源代码上发现executeTransactionAsync 创建一个新的RealmAsyncTask 并且任何待处理的事务Realm 都会创建一个新的bgRealm 实例。虽然在submitTransaction之后可以关闭,但是如果它在事务中,我不能手动停止所有实例,所以我不能删除领域文件。
    • 你可以注册一个onSuccess监听器,当它返回时关闭Realm实例?
    • @ChristianMelchior 需要使用 Realm 和 CleanArchitecture 的建议,尝试在 Reddit 上发布它,但它被自动删除,所以可能会将其标记为基于意见,我应该在哪里问?
    【解决方案2】:

    好的,所以这并不能真正解决问题(但它至少会尝试关闭主线程上的领域),但可以让您调试打开未关闭领域的原因和位置。

    只需获取TraceableRealm.getInstance(realmConfig, "I needed it for that tiny query") 的实例并关闭TraceableRealm 实例,而不仅仅是Realm

    realmIndex 中,您将获得仍然打开的Realms 的列表以及线程及其存在的原因...

    class TraceableRealm(
            val realm: Realm,
            val thread: String,
            val purpose: String
    ): Closeable
    {
        companion object {
            val realmIndex = mutableListOf<TraceableRealm>()
    
            fun getInstance(config: RealmConfiguration, purpose: String): TraceableRealm {
                val newRealm = TraceableRealm(Realm.getInstance(config), Thread.currentThread().name, purpose)
                realmIndex.add(newRealm)
                realmIndex.removeAll { !it.isOpen }
                return newRealm
            }
    
            fun killZombies() {
                runUI {
                    realmIndex.filter { it.isOpen && it.thread == Thread.currentThread().name }.forEach {
                        try {
                            it.close()
                        } catch (ex: Exception) {
                            Timber.d("Problem removing zombie realm: $it")
                        }
                    }
                    realmIndex.removeAll { !it.isOpen }
                    realmIndex.forEach {
                        Timber.d("Couldn't close realm: $it")
                    }
                }
            }
        }
    
        var isOpen = true
    
        override fun toString(): String {
            return "$purpose in $thread open=$isOpen"
        }
    
        override fun close() {
            realm.close()
            isOpen = false
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2017-09-24
      • 2022-01-18
      • 1970-01-01
      • 2014-11-28
      相关资源
      最近更新 更多