2016-12-18 6 views
1

状況:ORMLite DAOを使用して、データベース内の多くのレコード(例では10,000レコード)を変更する必要があります。すべてのレコードは、1つのテーブル、1つのカラム、およびIDを指定した変更レコードでのみ変更されます。ORMデータベース内の多くのレコードを簡単に変更するにはどうすればよいですか?

質問:ORMLite DAOを使用して、データベース内の多数のレコードを一度に更新する方法はありますか?

imagesDao.update(imageOrmRecord);

しかし(秒\ 100件のレコード)非常に遅いサイクルでレコードを更新:


今私はこのコードを使用して、レコードを更新します。

は、私は本当の更新レコード、SQLコードを使用するが、これは望ましくない...

+0

あなたの質問は何ですか? – GhostCat

答えて

1

SQLはセット指向言語だと思います。 ORMの全体のポイントは、これをオブジェクトに抽象化することです。 オブジェクトの束を更新するには、これらのオブジェクトを通過する必要があります。 (あなたがobject-relational impedance mismatchに実行した。また、The Vietnam of Computer Scienceをお読みください。)ORMLiteはあなたにバックドアto execute raw SQLを与える

someDao.executeRaw("UPDATE ..."); 
しかし、あなたの唯一の問題は、性能であれば、これは自動によって引き起こされる可能性がありますコミット・モード。各単一の文にトランザクション・オーバーヘッドが追加されます。 callBatchTasks()を使用するとこれが解決されます。

0

質問:ORMLite DAOを使用して、データベース内の多数のレコードを一度に更新するにはどうすればよいですか?

あなたが行っている更新内容は少し異なります。確かに、UpdateBuilderを使ってオブジェクトを卸売で更新することができます。あなたは生のSQLをこの方法を使用して行うだろうアップデートの大きな割合を達成することができるはず

// update hasDog boolean to true if dogC > 0 
updateBuilder.updateColumnExpression("hasDog", "dogC > 0"); 

UpdateBuilder<Account, String> updateBuilder = accountDao.updateBuilder(); 
// update the password to be "none" 
updateBuilder.updateColumnValue("password", "none"); 
// only update the rows where password is null 
updateBuilder.where().isNull(Account.PASSWORD_FIELD_NAME); 
updateBuilder.update(); 

かのようなもの。

エンティティごとに更新する必要がある場合は、それぞれに対してdao.update(...)を実行する必要があります。私がしなければならないことは、アップデートをより速くするためにトランザクションでそれを行うことです。 this answerを参照してください。

関連する問題