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

Realm数据库无法持久化布尔值:Checkbox状态保存问题求助

解决Realm中布尔值无法持久化的问题

嘿,我仔细看了你的代码,马上找到了导致布尔值无法持久化的核心问题,还有一些可以优化的地方,一起来看看:

核心问题:Model类未继承RealmObject

Realm要求所有需要持久化的实体类必须继承RealmObject(或者实现RealmModel接口并添加@RealmClass注解,继承RealmObject是更常用的方案)。你当前的Word类只是普通Java类,Realm根本无法识别它的字段进行持久化——虽然你说String和int类型能保存,这大概率是临时缓存的错觉,本质上整个对象的持久化逻辑都是不完整的,这才是布尔值重启后恢复默认的根本原因。

次要问题:冗余的copyToRealmOrUpdate调用

mWordData是从Realm查询出来的托管对象(managed object),在Realm事务中直接修改它的属性就会自动同步到数据库,完全不需要再调用copyToRealmOrUpdate,这个操作不仅多余,还可能引发不必要的对象状态冲突。


修复后的Model类代码

import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;

public class Word extends RealmObject { // 必须继承RealmObject
    @PrimaryKey
    private int id;
    private boolean checked;

    // Realm需要空构造函数,即使你不会直接调用,也要显式声明
    public Word() {
    }

    public void setId(String sid) {
        this.id = Integer.parseInt(sid);
    }

    public int getId() {
        return id;
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
    }

    public boolean isChecked() {
        return checked;
    }
}

优化后的Checkbox点击事件代码

我还帮你简化了事务代码,用Realm提供的executeTransaction方法更安全,也更简洁:

public void onCheckboxClicked(View view) {
    boolean checked = ((CheckBox) view).isChecked();
    if (view.getId() == R.id.checkButton) {
        // 用executeTransaction封装事务逻辑,无需手动begin/commit,出错时会自动回滚
        mRealm.executeTransaction(realm -> {
            // 直接修改托管对象属性,自动同步到数据库
            mWordData.setChecked(checked);
        });
    }
}

另外,别忘了在应用启动时初始化Realm(比如在自定义Application类中),确保Realm配置正确,这是所有持久化操作正常工作的前提哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:47:06