我想弄清楚RunInTransaction最终会做什么。除了"在数据库事务中执行指定的Runnable"。房间文档没有多说。
据我所知:
如果我们有一个像查询这样的异步操作,然后是一些没有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");
}
});;
insertDataFromNetwork
mDatabase.runInTransaction(new Runnable() {
@Override
public void run() {
mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);
mDatabase.repoMethods().insert(....);
}
}
});
答案 0 :(得分:-1)
事务表示数据库管理系统中针对数据库执行的工作单元。 (维基百科)
这意味着,例如,如果您将插入10个用户并更新其他10个不使用runInTransaction方法的用户,则Room将执行每个插入并更新为单个操作(事务),并将更新观察者,他们正在观察每次更改Users表。虽然在runInTransaction方法中执行相同的操作会将所有这些更改作为一个操作(事务)执行,并且只会通知侦听器一次。
我如何控制首先执行哪个程序?
只需在一个线程中顺序运行它们。 并且不要在主线程中运行数据库事务。