Java Android Room DAO如何在一个事务中运行多个DAO方法?
考虑下面的房间Java Android Room DAO如何在一个事务中运行多个DAO方法?,java,android,transactions,android-room,Java,Android,Transactions,Android Room,考虑下面的房间 @Dao public abstract class JobDao { @Insert public abstract long insert( Job v ); @Update public abstract int update( Job v ); @Insert public abstract long insertPerson( Person p ); @Update public abstrac
@Dao
public abstract class JobDao {
@Insert
public abstract long insert( Job v );
@Update
public abstract int update( Job v );
@Insert
public abstract long insertPerson( Person p );
@Update
public abstract int updatePerson( Person p );
@Transaction
public void insertNetJobs( List<NetJob> list ) {
Timber.d("--- insert page start");
for( NetJob j : list ) {
if ( updatePerson( j.getPerson() ) == 0 ) {
insertPerson( j.getPerson() );
}
insert( j.getJob() );
}
Timber.d("--- insert page end");
}
}
因此,insertNetJobs方法的工作速度非常慢。是否有可能只使用一个事务运行此方法 试试这个
roomDB.runInTransaction(new Runnable() {
@Override
public void run() {
Timber.d("--- insert page start");
for( NetJob j : list ) {
if ( updatePerson( j.getPerson() ) == 0 ) {
insertPerson( j.getPerson() );
}
insert( j.getJob() );
}
Timber.d("--- insert page end");
}
});
好的,我知道问题出在哪里了。如果有人有类似的问题,这里有一个解释。实际问题是更新查询。执行它大约需要20毫秒 此代码:
@Update
public abstract int updatePerson( Person p );
生成以下查询:
UPDATE OR ABORT `sw_person` SET `id` = ?,`id_s` = ?,`id_lang` = ?,`name` = ? WHERE `id` = ?
此查询更新人员表的pk,但在其他表中,此键用作fk,从而导致在这些表中查找。遗憾的是,“房间”在更新查询中更新pk,可能解决方案是手工编写查询 “因此insertNetJobs方法的工作速度非常慢”——有什么证据表明嵌套事务是原因?如何记录事务?我非常确定,如果添加
@transaction
注释,它将在一个事务中运行该函数中的所有内容@在sau_c中,我非常确定嵌套事务,如果您查看为DAO类生成的代码,它是obvious@CommonsWare我过去的经验告诉我,嵌套事务会减慢执行速度,但也许我错了,我会进行一些额外的测量
UPDATE OR ABORT `sw_person` SET `id` = ?,`id_s` = ?,`id_lang` = ?,`name` = ? WHERE `id` = ?