Запрос количества комнат не дает результата при запуске в фоновом потоке
У меня есть приложение для 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. Вы уверены, что это то, что вы хотите?