Как получить размер списка комнат в onCreate / в главном потоке? - PullRequest
0 голосов
/ 17 мая 2018

Как я могу легко получить счетчик размера базы данных, чтобы я мог затем выполнить соответствующие действия в зависимости от того, пуста ли БД или нет?

У меня есть приложение БД, View Model, Repository, Dao, и все остальные части, и мои объекты вставляются ... Но я не могу назвать onCreate() размер списка в БД.Когда я пытаюсь получить mAppDatabase.vehicleDao().getAll().getValue().size() или mVehicleViewModel.getAll().getValue().size(), я получаю исключения нулевого указателя.

Однако я знаю, что мои объекты вставляются, потому что когда я запускаю наблюдаемое, я могу регистрировать их информацию ... ноЯ не могу получить счет в главном потоке / в onCreate.Помогите!Пример кода ниже:

protected void onCreate(Bundle savedInstanceState) {
...
mAppDatabase = AppDatabase.getInstance(MyActivity.this);
Log.d("LISTSIZEAPP", String.valueOf(mAppDatabase.myDao().getAll().getValue().size()));
ObserveItems();

ИЛИ

protected void onCreate(Bundle savedInstanceState) {
...
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
Log.d("LISTSIZEVM",  String.valueOf(mViewModel.getAll().getValue().size()));
ObserveItems();

^ Исключение нулевого указателя для обоих (Попытка вызвать метод интерфейса 'java.lang.Object [] java.util.List.toArray () 'для пустой ссылки на объект) ...

однако:

private void ObserveItems() {
    mViewModel.getAll().observe(this, new Observer<List<Foo>>() {
        @Override
        public void onChanged(@Nullable final List<Foo> foos) {
            mFoos= foos;
            for (Vehicle v: mFoos) {
                Log.d("ROOM INFO - FOOS", v.getFooTitle());
            }
        }
    });
}

Я могу регистрировать всю информацию, которую хочу.Таким образом, элементы ЯВНО вставлены.Что дает?Чего мне не хватает?Спасибо.

1 Ответ

0 голосов
/ 17 мая 2018

Это синхронный доступ к данным из LiveData:

Log.d("LISTSIZEVM",  String.valueOf(mViewModel.getAll().getValue().size()));

Но эти данные, возможно, еще не поступили.

Попробуйте добавить этот запрос в свой Dao, см. google samples :

@Query("SELECT COUNT(column) FROM table")
int getDataCount();

Как указывает @CommonsWare, его нельзя вызвать из основного потока пользовательского интерфейса, поскольку онработа базы данных, которая заблокирует поток пользовательского интерфейса и выдаст ошибку.Вы можете либо вызвать это из основного потока, либо вернуть LiveData<Integer> и наблюдать значение, как вы сделали со списком данных.

@Query("SELECT COUNT(column) FROM table")
LiveData<Integer> getDataCount();
...