首页 > 解决方案 > 从 Realm 查询返回对象会引发实例关闭状态异常

问题描述

我有一个返回领域对象的函数。

private fun getNext(): MyRealmObject? {
        var item: MyRealmObject? = null
        try {
            Realm.getDefaultInstance().use { realm ->
                realm.executeTransaction { r: Realm ->
                    item = r.where(MyRealmObject::class.java).equalTo(MyRealmObject.PROPERTY_ID, 1).findFirst() ?: return@executeTransaction
                }
            }
        } catch (e: Exception) {
            Log.e(TAG, e.localizedMessage!!)
        } finally {
            return item
        }
    }

但是,当我调用该函数并尝试访问属性时,出现错误:

IllegalStateException:此 Realm 实例已关闭,使其无法使用。

private fun doSomething() {
    val item = getNext() ?: return
    val title = item.title // Error thrown here
}

我在这里做错了什么?


MyRealmObject.kt

@RealmClass
open class RealmPhoto : RealmObject() {
    @PrimaryKey
    @Index
    lateinit var id: Int

    var title: String = ""


    companion object {
        const val PROPERTY_ID = "id"
    }
}

标签: javaandroidkotlinrealm

解决方案


正如您的例外所说,领域已关闭,您无法访问其属性。

使用FindFirst()它会返回一个managed对象,当您访问它时需要打开领域。

您的解决方法是使用copyFromRealm

因此,将您的查询更改为以下内容

r.where(MyRealmObject::class.java).equalTo(MyRealmObject.PROPERTY_ID, 1).findFirst()?.copyFromRealm() ?: return@executeTransaction

推荐阅读