Запрос количества комнат не дает результата при запуске в фоновом потоке - PullRequest
0 голосов
/ 08 октября 2018

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

@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 голосов
/ 09 октября 2018

Вы получаете 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.Вы уверены, что это то, что вы хотите?

...