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

