Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Room DAO如何在一个事务中运行多个DAO方法?_Java_Android_Transactions_Android Room - Fatal编程技术网

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` = ?