Android Room + ViewModel использование - PullRequest
0 голосов
/ 19 мая 2019

Я хочу использовать компоненты Android + RoomModel для своего приложения, но я не совсем уверен, как.Одна из моих таблиц базы данных будет представлять записи категорий.Количество категорий будет меняться в зависимости от пользователя, поэтому я не создаю разные таблицы для каждой категории.Мне нужно сделать некоторые расчеты на этих данных, один из них сортирует данные в разных списках, но это будет актуально для всех моих фрагментов в приложении.И если бы я хотел использовать для этого живые данные, как мне это сделать?

Все примеры, которые я смог найти, наконец-то получили или наблюдали данные в действиях / фрагментах.Но, учитывая, что мне нужно будет выполнить эти вычисления на этих данных, и это будет иметь отношение ко всем фрагментам, я должен получить эти данные в моей модели представления и вычислить все там и просто оставить геттеры для моих фрагментов?

Что, если я хочу использовать LiveData для этого, зарегистрировать ли я наблюдателя в VIewModel, вычислить там значения в onChanged и создать еще одну LiveData из этого в ViewModel и позволить фрагментам слушать эти новые LiveData?

И еще одинвещь, если я в конечном итоге использую LiveData, и я не знаю, сколько категорий будет там, я слушаю все записи таблицы и заново вычисляю все, как только обнаружены изменения, или я создаю разных слушателей на основе "... WHERE CategoryID = :categoryID" чтобы не пересчитывать все, когда была добавлена ​​только одна запись категории?

1 Ответ

1 голос
/ 19 мая 2019

Вы должны получить эти данные в ViewModel, обработать данные и предоставить этому экземпляру ViewModel общий доступ к Fragments.Проверьте эту часть руководства ViewModel, чтобы увидеть, как разделить ViewModels между фрагментами.


Что, если я хотел использовать LiveDataдля этого я должен зарегистрировать наблюдателя в VIewModel, вычислить там все в onChanged и создать из него другие LiveData из ViewModel и позволить фрагментам прослушивать эти новые LiveData?

Нет.Вместо этого зарегистрируйте наблюдателя в ViewModel, используя LiveData.observeForever.

ExampleViewModel

class ExampleViewModel extends ViewModel {

    private final LiveData<Data> myLiveData;
    private final Observer<Data> myObserver;

    ExampleViewModel() {
        // Step 1: get LiveData and instantiate observer
        myLiveData = myRepository.getMyData();
        myObserver = (data) -> {...};

        // Step 2: use observeForever to observe the LiveData
        myLiveData.observeForever(myObserver);
    }


    @Override
    void onCleared () {
        // Step 3: remove observer
        myLiveData.removeObserver(myObserver);
    }
}


, если я в конечном итоге используюLiveData и я не знаю, сколько будет категорий, слушаю ли я все записи в таблице и заново вычисляю все, как только обнаружены изменения, или я создаю разных слушателей на основе "... WHERE CategoryID = :categoryID", чтобы избежать повторного вычислениявсе, когда была добавлена ​​только одна запись категории?

Комната знает, когда таблица изменяется, но не знает, как таблица изменилась, поэтому она пересчитает все, даже если вы укажете categoryID в запросе, и эта конкретная категория не изменилась.Создание разных слушателей для каждой категории не уменьшит стоимость вычислений, а только усложнит вашу логику.Вместо этого вы должны слушать всю таблицу, или, если вычисления слишком тяжелые, не используйте LiveData и не выполняйте однократный поиск.

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