安卓房间DAO如何在单个事务中运行多个DAO方法?



考虑以下房间 DAO

@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");
    }  
}

根据文档,标有@Transaction的方法中的任何内容都在单个事务中运行。但实际上,它为整个方法插入NetJobs运行一个事务,并为每个调用运行内部事务updatePerson,insertPerson,insert。所以日志看起来像那样

D/JobDao: ---- insert page start
D/SQLiteDatabase: beginTransaction() 
D/SQLiteDatabase: endTransaction()
                  beginTransaction()
D/SQLiteDatabase: endTransaction()
                  beginTransaction()
D/SQLiteDatabase: endTransaction()
                  beginTransaction()
........................
D/SQLiteDatabase: endTransaction()
                  beginTransaction()
D/SQLiteDatabase: endTransaction()
                  beginTransaction()
D/SQLiteDatabase: endTransaction()
D/JobDao: ---- insert page end

因此,方法插入NetJobs的工作速度非常慢。是否有可能仅使用一个事务运行此方法?

试试这个

  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,可能解决方案是手动编写查询。

最新更新