2

我有java.lang.IllegalStateException一段时间试图删除realm文件。

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

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

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

4

2 回答 2

1

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

请参阅https://realm.io/docs/java/latest/#closure-realmshttps://realm.io/docs/java/latest/#realm-instance-lifecycle

于 2017-11-14T07:14:39.830 回答
0

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

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

在里面realmIndex你会得到一个仍然 openRealm的列表以及线程和它们存在的原因......

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
    }
}
于 2020-02-05T07:03:46.293 回答