我在尝试删除java.lang.IllegalStateException
文件时获得了realm
。
java.lang.IllegalStateException:不允许删除与打开的Realm关联的文件。记得在删除文件之前关闭()Realm的所有实例:/data/data/com.mypackage.name/files/filename.realm
我使用了executeTransactionAsync
和executeTransaction
方法。所以,我想在删除整个async
文件之前,有一个实例realm
无法关闭它。
如何在不收到此异常的情况下关闭realm
的所有实例或如何删除realm
文件?
答案 0 :(得分:1)
如果没有更多细节,很难回答,因为开放实例可能来自很多地方。也许下面的两个链接可以为您使用Realm实例提供一些指导:
请参阅https://realm.io/docs/java/latest/#closing-realms和https://realm.io/docs/java/latest/#realm-instance-lifecycle
答案 1 :(得分:0)
好的,所以这并不能真正解决问题(但它至少会尝试在主线程上关闭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
}
}