我在尝试删除realm
文件时得到了java.lang.IllegalStateException
。
java.lang.IllegalStateException:不允许删除与开放 Realm 关联的文件。记得在删除 Realm 文件之前关闭 Realm 的所有实例:/data/data/com.mypackage.name/files/filename.realm
我使用了executeTransactionAsync
和executeTransaction
方法。所以,我想有一个实例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
}
}