Запрос количества комнат не дает результата при запуске в фоновом потоке

У меня есть приложение для Android, которое использует Room. Мне нужно проверить количество элементов, вставленных в мою таблицу, поэтому я написал следующий код в моем интерфейсе Дао

@Query("SELECT COUNT(*) FROM notes")
int getCount();

В моем классе репозитория я написал код примерно так:

public int deleteNote(final NoteEntity note) {
    final int[] count1 = new int[1];
    executor.execute(new Runnable() {
        @Override
        public void run() {
           count1[0] = mDb.schoolDao().getCount();
        }
    });

    return count1[0];
    }

Теперь, когда я вызываю вышеупомянутый метод в моем ActivityЯ получаю count как ноль, но когда я заставляю мое приложение работать в главном потоке, т.е. удаляя Runnable код, то он возвращает действительный count, Я знаю, что запуск любого запроса к базе данных в основном потоке не является хорошим вариантом, но я не понимаю, почему я получаю нулевое значение, когда оно выполняется в фоновом потоке.

Просто чтобы было ясно, что в базе данных всегда есть данные.

1 ответ

Решение

Вы получаете 0 отсчета, потому что count1[0] вернулось раньше, чем фактический запрос к БД завершился Вместо использования массива используйте MutableLiveData. Что-то вроде этого:

@Query("SELECT COUNT(*) FROM notes") MutableLiveData< Integer> getCount();

Теперь вы получите экземпляр MutableLiveData сразу после вызова кода, но вы не сможете использовать его прямо сейчас, потому что он пуст. Что вам нужно сделать, это подписаться на новые данные:

mDb.schoolDao().getCount(). observe (this, new Observer<Integer>() { @Override public void onChanged(@Nullable final Integer val {count[0]=val; }}; 

Обратите внимание, что вам не нужно запускать этот код в фоновом режиме. Просто подпишитесь сразу после инициализации count [] и когда DB вернет значение счетчика, будет вызван метод onChanged().

Не уверен, что это ошибка, но вы возвращаете count [0] в методе, который возвращает void. Вы уверены, что это то, что вы хотите?

Другие вопросы по тегам