Как эффективно и часто делать запросы к базе данных Room с ViewModel и LiveData? - PullRequest
0 голосов
/ 19 мая 2018

Редактировать: То, что я спрашиваю по существу.

В SQLite я мог бы создать курсор из моего запроса следующим образом:

 Cursor cursor = db.query(TABLE_NAME, columns, searchClause, selectionArgs, null, null, null);

Где я могпередать разные столбцы, searchClauses или selectionArgs, чтобы точно указать данные, которые я хочу с моим запросом.

Что эквивалентно этому с базой данных комнат ??

Редактировать 2: Кроме того, если я сделаю запрос к базе данных, я получу список со всеми элементами, хранящимися вбаза данных.Оттуда я хочу создать другой список, который объединяет элементы в другой список.Например, если у меня есть три элемента синего цвета в базе данных, я хочу показать элемент списка с элементом «синий», который также показывает среднее значение цены продажи по этим трем элементам.Таким образом, новый список будет состоять из всех цветовых элементов, объединенных в один элемент списка для каждого цвета, с соответствующими средними значениями в цене продажи.

Как бы я поступил так?


Итак, у меня довольно большая база данных с 50 столбцами для моего приложения.Большинство столбцов могут принимать различные значения, которые определяются пользовательским вводом.

Я буду отображать эти данные по всему моему приложению в различных фрагментах (в том же упражнении), используя в них listViews.

Таким образом, мой первоначальный подход состоял в том, чтобы просить большие, но небольшие запросы Room, получить нужные мне данные там, где они мне нужны.Тем не менее, я застрял в том, как сделать многие из этих запросов при использовании архитектуры ViewModel / LiveData.

Например, в моем дао это может быть запрос:

@Query("SELECT selling_price FROM table WHERE colour IN (:colours)")
LiveData<List<Shoe>> getColour(String[] colours);

Я бы использовал это, когда хочу составить список, который показывает цвета и средние значения.цена продажи например.Элемент списка может иметь один элемент (например, синий) или два или более цветов (черный и желтый), поэтому мне нужно использовать строку [].(Мое приложение не об обуви / цветах, я просто использую это в качестве примера) ..

Чтобы выполнить этот запрос, мне нужно настроить ViewModel с правом Factory ?Примерно так:

public class ArrayViewModel extends ViewModel {


private LiveData<List<Shoe>> colourList;
private final String[] mColours;

public ArrayViewModel(Database dataBase, String[] colours){

    mColours = colours;
    colourList = dataBase.shoeDao().getColours(actions);

}


public LiveData<List<Shoe>> getColours(){return colourList;}

public static class ArrayViewModelFactory extends ViewModelProvider.NewInstanceFactory {

    private final Database mDatabase;
    private final String [] mColours;

    public ArrayViewModelFactory(Database dataBase, String[] colours) {

        mDatabase = dataBase;
        this.mColours = colours;
    }


    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        return (T) new ArrayViewModel(mDatabase, mColours);
    }
}

}

Затем я запросил бы данные в моей Деятельности или Фрагменте, как это.Я должен передать свой определенный цвет [] с цветами, которые я хочу запросить на заводе.

 ArrayViewModel.ArrayViewModelFactory factory = new ArrayViewModel.ArrayViewModelFactory(database,color[])
    final ArrayViewModel viewModel = ViewModelProviders.of(this,factory).get(ArrayViewModel.class);
    viewModel.getColours().observe(this, new Observer<List<Shoe>>() {
        @Override
        public void onChanged(@Nullable List<Shoe> shoes) {
            //do stuff
        }
    });

Это были моя проблема / вопрос ложь:

Если я хочу запросить «синий» для моего первого элемента списка.И {"черный", "желтый"} для моего второго, а затем и другие цвета для моего третьего элемента списка.Должен ли я каждый раз создавать новую фабрику, а затем устанавливать новую фабрику в ViewModel?а Как еще я могу получить эти данные?И это только маленький пример: иногда я хочу получить среднее значение.цена продажи указана по размеру обуви.Иногда я хочу запросить наиболее популярные размеры обуви по цвету.

Моя реальная база данных содержит 50 столбцов с множеством разных потенциальных запросов, которым требуется разное количество / тип передаваемых аргументов.Как я могу сделать все эти запросы для заполнения различных listViews / RecyclerViews с его помощью?Не может быть, чтобы мне приходилось каждый раз создавать новую фабрику и создавать десятки ViewModels, чтобы учесть каждый тип аргумента и количество передаваемых данных?Или это похоже на создание нового курсора для каждого запроса в SQLite?

В сущности, я не знаю, как выполнить столько запросов с помощью Room.

Моя альтернативная идея:

Вместо сотен маленьких запросов (если я выясню, как это сделать), я подумал, что просто сделаю запрос к базе данных один раз иgetAllData с моей ViewModel.Это даст мне список со всеми данными.

Оттуда я мог бы просто запустить / отфильтровать список в цикле for, чтобы найти то, что я хочу?

Например:

 for (int i = 0; i < allShoesList.size(); i++ ){

        Shoe shoe= allShoesList.get(i);

        String colour = hand.getColour();

        //make different lists according to Colour
        switch (colour){

            case "blue":              
                blueList.add(shoe);
                break;

            case "black":
                blackList.add(shoe);
                break;

               ...

        }

    }

Затем я мог бы получить эти списки из Activity с помощью методов getter в соответствующих адаптерах, а затем выполнить там другие операции?Как получить средний размер обуви или среднюю цену продажи, разделенную по цвету, и затем отобразить эти средние значения в списке?

По сути, я не уверен, как подходить к извлечению всех этих данных в несколько представлений списка, когда мне нужны только очень специфические данные в каждом listView, а не все данные.

...