如何验证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
相关产品推荐
相关产品推荐

