我正在努力弄清楚RunInTransaction到底是做什么的。Room文档并没有提供太多信息,只是说“在数据库事务中执行指定的Runnable”。
据我所知:
如果我们有一个异步操作,如查询,然后进行一些插入操作而没有使用runInTransaction
据我所知:
如果我们有一个异步操作,如查询,然后进行一些插入操作而没有使用runInTransaction
roomDB.runInTransaction(new Runnable() {
@Override
public void run() {
query
}
});
insertions
insertions
runInTransaction函数会在指定操作完成前锁定数据库。因此,在第一次插入时,线程会暂停(请纠正我),直到runInTransaction完成。
我如何控制哪个过程先执行?
但我认为无论如何,数据库都会锁定表格,而不使用runInTransaction方法。如果我错了,请纠正我。
更新
@Dao
public interface RepoDao {
@Query("SELECT * FROM Table")
LiveData<List<Table>> getAll();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(List<Table> table);
}
主活动
repo = ((BasicApp)getApplication()).getRepository();
repo.insertDataFromNetwork();
((BasicApp)getApplication()).getDatabase().repoMethods()
.getAll().observe(this, new Observer<List<Table>>() {
@Override
public void onChanged(@Nullable List<Table> message) {
Log.d("hello");
}
});;
插入来自网络的数据
mDatabase.runInTransaction(new Runnable() {
@Override
public void run() {
mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);
}
}
});