如何在删除文件之前关闭 Realm 数据库的所有实例



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

java.lang.IllegalStateException:不允许删除与开放 Realm 关联的文件。记得在删除 Realm 文件之前关闭 Realm 的所有实例:/data/data/com.mypackage.name/files/filename.realm

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

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

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

查看 https://realm.io/docs/java/latest/#closing-realms 和 https://realm.io/docs/java/latest/#realm-instance-lifecycle

好的,所以这不会真正解决问题(但它至少会尝试在主线程上关闭 Realms(,但会允许你调试为什么以及在何处打开一个未关闭的 Realm。

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

realmIndex里面,您将获得一个仍然开放的Realm的列表,以及它们的线程和存在的原因......

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
    }
}

最新更新