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
相关产品推荐
相关产品推荐

