Метод RunInTransaction в комнате - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь выяснить, что в итоге делает 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 голосов
/ 07 июня 2018

Транзакция символизирует единицу работы, выполненную в системе управления базой данных с базой данных.(Википедия)

Это означает, что, если вы, например, вставите 10 пользователей и обновите 10 других пользователей, не используя метод runInTransaction, Room выполнит каждую вставку и обновление как одно действие (транзакция), и будетобновлять наблюдателей, которые каждый раз наблюдают за изменениями в таблице пользователей.При выполнении того же действия в методе runInTransaction все эти изменения будут выполнены как одно действие (транзакция) и будут уведомлять слушателей только один раз.

Как я могу контролировать, какая процедура выполняется первой?

Просто запустите их последовательно в одном потоке.И не запускайте транзакции базы данных в главном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...