【问题标题】:What is the best way to update all rows in Realm.io database table on Android?在 Android 上更新 Realm.io 数据库表中所有行的最佳方法是什么?
【发布时间】:2017-07-26 13:49:22
【问题描述】:

更新 Realm 数据库表中所有记录的最佳方法是什么?
这是我此刻所做的:

  1. 我正在将所有行选择到 RealmResults 列表中
  2. 在循环中一一更新
  3. 再次将更新 RealmResults 保存到 Realm 数据库。

我的代码:

@Override
public void updateAll(final Fragment fragment) {
    final long startTime = System.nanoTime();
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            final RealmResults<Stock> realmResults = realm.where(Stock.class).findAll();
            Log.d(Constants.LOG_TAG, "All rows [" + realmResults.size() + "] selected and fetched into RealmResults. Called 'execute' callback.");
            for (Stock stock : realmResults) {
                stock.setDate("1");
                stock.setAdjClose(2);
                stock.setVolume(3);
                stock.setHigh(4);
                stock.setLow(5);
                stock.setOpen(6);
                stock.setClose(7);
            }
            realm.insertOrUpdate(realmResults);
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            Log.d(Constants.LOG_TAG, "All rows updated. Called 'onSuccess' callback.");
            ((RealmFragment) fragment).stopBenchmark(startTime, System.nanoTime());
        }
    });
}

我还有一个问题:

与 SQLite 相比,您如何看待 UPDATE 操作的性能? 在我看来,SQLite 在更新数据方面应该总是比 Realm(使用 POJO)快得多。

【问题讨论】:

  • 您不需要在RealmResults 上调用insertOrUpdate(),这是一个空操作。

标签: java android database realm


【解决方案1】:

您在正确的轨道上,但查询不必在事务中,当您在事务中时,您不必再次插入更新的对象。事务中的写入会在领域中自动更新。这就是重点。

@Override
public void updateAll(final Fragment fragment) {
    final long startTime = System.nanoTime();
    final RealmResults<Stock> realmResults = realm.where(Stock.class).findAll();
    Log.d(Constants.LOG_TAG, "All rows [" + realmResults.size() + "] selected and fetched into RealmResults. Called 'execute' callback.");

    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            for (Stock stock : realmResults) {
                stock.setDate("1");
                stock.setAdjClose(2);
                stock.setVolume(3);
                stock.setHigh(4);
                stock.setLow(5);
                stock.setOpen(6);
                stock.setClose(7);
            }
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            Log.d(Constants.LOG_TAG, "All rows updated. Called 'onSuccess' callback.");
            ((RealmFragment) fragment).stopBenchmark(startTime, System.nanoTime());
        }
    });
}

与 SQLite 相比,您如何看待 UPDATE 操作的性能?在我看来,在更新数据方面,SQLite 应该总是比 Realm(使用 POJO)快得多。

这不是主观问题。一个更快,一个更慢。您可以在news post 中查看将领域与 sqlite 进行比较的基准

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多