You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Realm Kotlin SDK报错:无法在写事务外修改托管List求排查

问题分析与解决

你遇到的「无法在写事务外修改托管List」错误,核心问题出在两点:

  • activeSchoolClass是在realm.write事务外部获取的托管Realm对象,直接在事务内修改它的属性,可能因为对象的事务上下文不匹配触发错误。
  • 多余调用了copyToRealm(activeSchoolClass):该方法用于将非托管对象转为托管状态,而activeSchoolClass本身已是托管对象,这步操作不仅没必要,还会干扰对象的状态逻辑。

修正方案

方案一:在事务内获取对象的最新托管引用

确保修改的是当前事务内的对象实例:

activeSchoolClassNotNull { activeSchoolClass ->
    val schoolSubjects = ocjeneSkoleScraper.getSubjects()
    realm.write {
        // 获取当前事务内的对象引用,避免上下文不匹配
        val realmManagedClass = findLatest(activeSchoolClass) ?: return@write
        realmManagedClass.schoolSubjects = schoolSubjects.toRealmList()
        this@SchoolRepositoryImpl.activeSchoolClass = realmManagedClass
    }
}

方案二:若对象为非托管状态(针对自定义对象场景)

如果activeSchoolClass是你手动创建的非托管对象,应先设置属性再转为托管:

activeSchoolClassNotNull { activeSchoolClass ->
    val schoolSubjects = ocjeneSkoleScraper.getSubjects()
    // 先给非托管对象设置属性
    activeSchoolClass.schoolSubjects = schoolSubjects.toRealmList()
    realm.write {
        // 将非托管对象转为托管并持久化
        val managedClass = copyToRealm(activeSchoolClass, updatePolicy = UpdatePolicy.ALL)
        this@SchoolRepositoryImpl.activeSchoolClass = managedClass
    }
}

内容的提问来源于stack exchange,提问作者Pisoj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:11:09