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/

10-11 05:17