情况:我需要使用 ORMLite DAO 更改数据库中的许多记录(例如,10 000条记录)。所有记录仅在一个表中,在一列中更改,并更改已指定id的记录。
问题:如何使用 ORMLite DAO 一次更新数据库中的多条记录?
现在我使用以下代码更新记录:
imagesDao.update(imageOrmRecord);
但是在周期中更新记录非常慢(100条记录\秒)。
我认为真正的更新记录,使用SQL代码,但这是不可取的......
答案 0 :(得分:1)
SQL是一种面向集合的语言。 ORM的重点是将其抽象为对象。 因此,当您想要更新一堆对象时,您必须浏览这些对象。 (您已经遇到了object-relational impedance mismatch;还阅读了The Vietnam of Computer Science。)
ORMLite为您提供了一个后门to execute raw SQL:
someDao.executeRaw("UPDATE ...");
但如果您唯一的问题是性能,则可能是由自动提交模式引起的,这会为每个语句增加事务开销。使用callBatchTasks()可以解决此问题。
答案 1 :(得分:0)
问题:如何使用ORMLite DAO一次更新数据库中的多条记录?
这取决于您正在进行的更新。您当然可以使用UpdateBuilder
来对对象进行批量更新。
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();
或类似的东西:
// update hasDog boolean to true if dogC > 0
updateBuilder.updateColumnExpression("hasDog", "dogC > 0");
您应该能够以这种方式完成使用原始SQL所做的大部分更新。
但是,如果您需要进行每个实体更新,那么您需要为每个实体更新dao.update(...)
。我当时要做的是在事务中执行此操作以使更新更快。请参阅this answer。