更新Android上Realm.io数据库表中所有行的最佳方法是什么?

时间:2017-07-26 13:49:23

标签: java android database realm

更新Realm数据库表中所有记录的最佳方法是什么? 这就是我现在所做的事情:

  1. 我正在将所有行选入RealmResults列表
  2. 循环更新它们
  3. 再次将RealmResults更新到Realm数据库。
  4. 我的代码:

    @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)快得多。

1 个答案:

答案 0 :(得分:0)

您处于正确的轨道上,但查询不必在事务中,并且在您处于事务中时,您不必再次插入更新的对象。事务中的写入将自动更新。这就是它的重点。

@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进行比较的基准