Iam试图弄清楚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(....);
}
}
});
最佳答案
事务表示在数据库管理系统中针对数据库执行的工作单元。 (维基百科)
这意味着,例如,如果您将插入10个用户并更新10个其他不使用runInTransaction方法的用户,则Room将作为单个操作(事务)执行每个插入和更新,并更新观察者,这些观察者将观察每次用户表。在runInTransaction方法中执行相同的操作时,所有这些更改将作为一个动作(事务)执行,并且只会通知侦听器一次。
如何控制首先执行哪个程序?
只需在单个线程中依次运行它们即可。
并且不要在主线程中运行数据库事务。
关于android - Room中的RunInTransaction方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50736698/