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

如何验证Realm中新增数据行是否成功?附RealmObject类代码

验证Realm中新增数据行是否成功的几种方法

嘿,针对你的ZAccountTable类,我来分享几个靠谱的验证数据是否成功写入Realm的方法,都是日常开发里常用的:

1. 写入事务完成后直接查询验证(同步写入场景)

如果是用同步的事务写入数据,写完之后直接查询对应的记录,就能确认是否成功。比如你可以根据主键id来查询——因为主键是唯一的,非常适合做验证:

// 1. 先完成数据写入的同步事务
Realm realm = Realm.getDefaultInstance();
try {
    realm.executeTransaction(realmInstance -> {
        // 创建你的ZAccountTable对象并赋值(这里123L是主键id,要确保唯一)
        ZAccountTable newAccount = realmInstance.createObject(ZAccountTable.class, 123L);
        newAccount.setzAccountIdentificator("TEST_ACCOUNT");
        newAccount.setOpenDate(new Date());
        // 其他字段按需设置...
    });

    // 2. 写入完成后,立即查询验证
    ZAccountTable insertedAccount = realm.where(ZAccountTable.class)
                                          .equalTo("id", 123L)
                                          .findFirst();
    if (insertedAccount != null) {
        // 验证成功!可以打印字段确认
        System.out.println("数据新增成功,账号标识:" + insertedAccount.getzAccountIdentificator());
    } else {
        // 数据没写入,排查下事务逻辑或者主键是否冲突
        System.out.println("数据新增失败");
    }
} finally {
    realm.close();
}

2. 利用RealmChangeListener监听实时变化(异步/实时场景)

如果是异步写入,或者想监听Realm数据库的实时变化,可以给Realm实例或者对应的查询结果添加监听器,当数据新增时会触发回调:

Realm realm = Realm.getDefaultInstance();
// 先创建一个查询(这里监听所有ZAccountTable数据)
RealmResults<ZAccountTable> accounts = realm.where(ZAccountTable.class).findAllAsync();

// 添加监听器
accounts.addChangeListener(new RealmChangeListener<RealmResults<ZAccountTable>>() {
    @Override
    public void onChange(RealmResults<ZAccountTable> results) {
        // 当数据变化时(包括新增),这里会触发
        ZAccountTable insertedAccount = results.where().equalTo("id", 123L).findFirst();
        if (insertedAccount != null) {
            System.out.println("监听到数据新增成功!");
            // 记得用完移除监听器,避免内存泄漏
            accounts.removeChangeListener(this);
        }
    }
});

// 执行异步写入事务
realm.executeTransactionAsync(realmInstance -> {
    ZAccountTable newAccount = realmInstance.createObject(ZAccountTable.class, 123L);
    newAccount.setzAccountIdentificator("TEST_ACCOUNT");
    // 其他字段设置...
});

3. 检查异步事务的回调结果

如果用executeTransactionAsync异步写入,还可以利用它的成功/失败回调直接确认:

Realm realm = Realm.getDefaultInstance();
realm.executeTransactionAsync(
    // 写入逻辑
    realmInstance -> {
        ZAccountTable newAccount = realmInstance.createObject(ZAccountTable.class, 123L);
        newAccount.setzAccountIdentificator("TEST_ACCOUNT");
        // 其他字段设置...
    },
    // 成功回调:到这里说明事务提交成功,数据肯定写入了
    () -> System.out.println("异步写入事务执行成功,数据已新增!"),
    // 失败回调:如果事务出错会走到这里,比如主键冲突、IO异常等
    error -> {
        System.err.println("写入失败,错误原因:" + error.getMessage());
        error.printStackTrace();
    }
);

额外注意点

  • 因为你的ZAccountTable用了@PrimaryKey的id字段,所以如果写入时用了已存在的id,Realm会覆盖原有数据而不是新增,这点要特别注意!如果是要确保新增,最好先查询该id是否存在,或者处理主键冲突的情况。
  • 不管是同步还是异步写入,都要记得正确关闭Realm实例,避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:46:34