gpt4 book ai didi

java - Android Room DAO 如何在单个事务中运行多个 DAO 方法?

转载 作者:行者123 更新时间:2023-11-29 23:43:02 26 4
gpt4 key购买 nike

考虑以下 Room 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 的方法内部的任何内容都在单个事务中运行。但实际上它为整个方法 insertNetJobs 运行一个事务,为每个调用 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

因此,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");
}
});

关于java - Android Room DAO 如何在单个事务中运行多个 DAO 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51715200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com