Room中的RunInTransaction方法

时间:2018-06-07 08:40:50

标签: android android-room

我想弄清楚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(....);

                       }
                   }
               });

1 个答案:

答案 0 :(得分:-1)

事务表示数据库管理系统中针对数据库执行的工作单元。 (维基百科)

这意味着,例如,如果您将插入10个用户并更新其他10个不使用runInTransaction方法的用户,则Room将执行每个插入并更新为单个操作(事务),并将更新观察者,他们正在观察每次更改Users表。虽然在runInTransaction方法中执行相同的操作会将所有这些更改作为一个操作(事务)执行,并且只会通知侦听器一次。

  

我如何控制首先执行哪个程序?

只需在一个线程中顺序运行它们。 并且不要在主线程中运行数据库事务。